php - 现在需要通过 http “可用”的 Laravel 命令
问题描述
我有一个在 Laravel 中创建的网络应用程序,它接受信用卡付款。
每天我创建的一个预定命令都会运行以接收“今天的”付款(基本上它会为每个待处理的付款提交一个 http 请求到支付网关)。
现在我需要允许通过仪表板中的按钮触发此付款提交过程。
该命令需要随机长时间来处理(取决于要处理的付款数量),因此我认为从控制器调用它不是一个选项。
我正在考虑重构它:将所有命令代码移动到“中间人”类,这样我就可以在命令和控制器上调用这个类。
PaymentsSubmissionHelper::submit()
PaymentsSubmissionCommand: PaymentsSubmissionHelper::submit()
PaymentsSubmissionController: PaymentsSubmissionHelper::submit()
但是,该命令会显示一个进度条和预计的处理时间,我还需要在 html 界面中显示一个进度条。在 Web 界面中,我需要向服务器发出 ajax 请求以获取当前进度,但在命令中以完全不同的方式跟踪此进度,使用:
$bar = $this->output->createProgressBar($totalPayments);
$bar->setFormat(' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %message%');
对于每笔已处理的付款:
$bar->advance();
如何创建对命令和控制器的进度的跟踪?
任何帮助将不胜感激。
提前致谢!
解决方案
正如在另一个答案中已经指出的那样,Laravel 的排队事件侦听器是在前端处理长时间运行的进程的方式。您根本不需要重构控制台命令。
至于在前端显示进度,一个简单的解决方案是设置一些 AJAX 轮询。每隔几秒钟,AJAX 就会向控制器方法发出请求,该方法只查看今天的付款,计算处理了多少(假设您有某种status
字段可以显示正在运行的作业是否已处理它),并且返回一个代表已完成百分比的数字。然后,AJAXsuccess
处理程序将更新页面上的进度跟踪器。
// Check status every 2s
var timer = setInterval(function() {
pollStatus();
}, 2000);
pollStatus = function() {
$.ajax({
url: 'somewhere/jobStatus',
success: function(resp) {
$('#progress').html(resp . '%');
if (resp === 100) {
// We've reached 100%, no need to keep polling now
clearInterval(timer);
}
}
});
}
以某种方式确保民意调查不会溢出可能是明智之举,也许您想调整民意调查的频率。
推荐阅读
- android - 无头模拟器运行时无法运行 npm 脚本
- python - 无法在 PyVisa 中读取
- java - 循环二维数组
- android - Android 11 在上传从内部存储中选择的 pdf 时出错(打开失败:EACCES(权限被拒绝))
- flutter - 用空格而不是逗号将数字格式化为千位分隔符
- vb.net - 如何将 System.Drawing.Image 转换为 WPF 图像
- kubernetes - 一个 pod 的 Configmap 环境变量对集群的其他 pod 可见
- php - Woocommerce 在购物车图标悬停内显示添加的产品摘要
- mysql - 信任暴露在互联网上的共享 mysql 服务器
- r - 二项式负分布