首页 > 解决方案 > 现在需要通过 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();

如何创建对命令和控制器的进度的跟踪?

任何帮助将不胜感激。

提前致谢!

标签: phplaravellaravel-controller

解决方案


正如在另一个答案中已经指出的那样,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);
            }
        }
    });
}

以某种方式确保民意调查不会溢出可能是明智之举,也许您想调整民意调查的频率。


推荐阅读