在Laravel中,您可以使用作业在后端队列中执行任务,而应用程序的其余部分则执行其他操作。 我有一个由用户输入启动的工作。 我立即通过JavaScript向用户发出通知,告知正在处理作业。
我希望能够在作业成功完成后发出类似的通知。
我从这样的模型中调用我的工作:
public function doSomething() {
$job = new 'App'Jobs'MyJob();
app('Illuminate'Contracts'Bus'Dispatcher')->dispatch($job);
}
这就是我的作业标题的样子:
class MyJob extends Job implements SelfHandling, ShouldQueue
{
use InteractsWithQueue, SerializesModels, Queueable;
...
}
模型作业调用实际上是从控制器方法触发的:
public function getDoSomething($id) {
$item = Item::findOrFail($id);
$item->doSomething();
return response()->json(true);
}
由 AJAX 调用处理:
$.ajax({
url: $(this).attr('href'),
type: 'GET',
dataType: 'json',
success: $.proxy(function(result) {
this.application.notification.showMessage('Job is being processed.');
}, this),
error: $.proxy(function(result) {
console.error(result);
}, this)
});
你可以在应用服务提供程序上使用 Queue::after 函数
导入此依赖项
use Illuminate'Support'Facades'Queue;
use Illuminate'Queue'Events'JobProcessed;
use Illuminate'Queue'Events'JobProcessing;
在启动方法上,您将使用它
public function boot()
{
Queue::before(function (JobProcessing $event) {
// $event->connectionName
// $event->job
// $event->job->payload()
});
Queue::after(function (JobProcessed $event) {
// $event->connectionName
// $event->job
// $event->job->payload()
});
}
可能我迟到了派对的人,但我能想到几种选择。当用户从前端单击按钮时,您可以禁用属性和一些文本,例如"处理"。然后,您可以:
- 只需 ping 端点即可检查正在执行的作业是否已完成
- 使用网络套接字
我认为 Forge 正在使用 pusher 端点进行 websocket,以查看当您尝试部署新代码时服务器是否处于活动状态。如果您打开Devtools->Resources->Sockets,我可以清楚地看到通信。
您可以使用队列事件,Laravel文档对此进行了解释: https://laravel.com/docs/5.6/queues#job-events
作业完成事件
Queue::after
方法允许您注册要在排队作业成功执行时执行的回调。此回调是执行其他日志记录、对后续作业进行排队或为仪表板增加统计信息的绝佳机会。
这已经在您从拉拉维尔共享的页面链接中。