【发布时间】:2021-12-23 07:17:32
【问题描述】:
我正在尝试使用 Laravel 8 在后台运行一个耗时的脚本,但无法让它正常工作。我尝试按照此处的文档 https://laravel.com/docs/8.x/queues 结合此处找到的教程:https://learn2torials.com/a/how-to-create-background-job-in-laravel
根据文档,我应该运行以下命令以在 Laravel 中使用队列/作业进行分层
php artisan queue:table
php artisan migrate
然后我们应该使用以下命令创建我们的作业
php artisan make:job TestJob
App\Jobs\ 中是我们新创建的作业文件:TestJob.php
再次遵循文档,我应该将耗时的脚本/代码放在 TestJob.php 的 handle() 方法中。我在handle() 中编写了以下代码用于测试目的:
public function handle()
{
//Do some time-consuming stuff
sleep(30);
}
接下来,根据文档,我们应该在应用程序的任何位置使用以下代码行 TestJob::dispatch() 调度我们的工作,因此出于测试目的,我将这一行直接放入我们的路由文件中,如下所示:
Route::get('/', function () {
//Run this job in the background and continue
\App\Jobs\TestJob::dispatch();
//After job is started/Queued return view
return view('welcome');
});
正如我从文档中了解到的那样,应该是这样,但它没有按我预期的那样工作。 handle() 中的代码被执行,但return view('welcome'); 在作业完成后执行。
我期待脚本被执行,并且在后台运行时将执行下一行代码。我怎样才能让它在后台运行,这样用户就不必等待脚本完成?
我搜索了很多,根据前面链接的教程,我的 .env 文件中应该有以下行:QUEUE_DRIVER=database。我已经坐在了这个位置,并且还在 Config\queue.php 中使用了以下行:'default' => env('QUEUE_CONNECTION', 'database'),,但结果仍然相同
我还在 SO (link) 上找到了 Laravel 5 的以下解决方案,建议我们还应该运行以下代码以使其工作:php artisan queue:listen,但结果相同
任何帮助将不胜感激!
【问题讨论】:
-
dispatch是同步的,您需要使用在后台执行php artisan queue:work的单独进程。你不能在你的 php 代码中做异步工作。您可以使用 beanstalkd 在后台运行queue:work命令:laravel.com/docs/8.x/queues#supervisor-configuration
标签: php laravel laravel-8 background-process