Laravel 8,如何在后台运行一个作业(脚本)?

Laravel 8, how to run a job (script) in the background?

我正在尝试 运行 在后台使用 Laravel 8 一个耗时的脚本,但无法让它正常工作。我试着按照这里的文档 https://laravel.com/docs/8.x/queues in combination with the tutorial found here: https://learn2torials.com/a/how-to-create-background-job-in-laravel

根据文档,我应该 运行 以下命令在 Laravel

中与 Queue/jobs 一起制定策略
php artisan queue:table
php artisan migrate

然后我们应该使用以下命令创建我们的作业

php artisan make:job TestJob

App\Jobs\ 中是我们新创建的作业文件:TestJob.php

再次按照文档,我应该将耗时 script/code 放在 TestJob.phphandle() 方法中。为了测试目的,我在 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 () 上找到了 Laravel 5 的以下解决方案,其中建议我们还应该 运行 以下代码才能使其正常工作: php artisan queue:listen,但还是一样的结果

如有任何帮助,我们将不胜感激!

默认 .env 文件有 QUEUE_CONNECTION=sync.

意思是,sync连接使用主线程来执行任务。因此,它必须先完成 ,然后 继续下一行代码。

要在后台执行任务 运行 以便您的主应用程序线程不会阻塞并且您可以更快地满足您的客户端请求,请尝试使用不同的连接,即 database

  • 为此,只需更改 .env 文件中的 QUEUE_CONNECTION=database

您可以 运行 php artisan queue:listen 在您的本地计算机上设置以在任务传入时对其进行处理。

注意: 在生产服务器上,设置更强大的功能以在进程失败时自动重启您的进程可能更方便。 Supervisor Configuration