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

Mic*_*nDK 4 php background-process laravel laravel-8

我正在尝试使用 Laravel 8 在后台运行一个耗时的脚本,但无法完全让它工作。我尝试按照此处的文档https://laravel.com/docs/8.x/queues结合此处找到的教程: https: //learn2torials.com/a/how-to-create-background-job -in-laravel

\n

根据文档,我应该运行以下命令来制定 Laravel 中的队列/作业策略

\n
php artisan queue:table\nphp artisan migrate\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
php artisan make:job TestJob\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

再次遵循文档,我应该将耗时的脚本/代码handle()放入TestJob.php. 我在中编写了以下代码handle()为了测试目的,

\n
public function handle()\n{\n    //Do some time-consuming stuff\n    sleep(30);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

接下来,根据文档,我们应该在应用程序中的任何位置使用以下代码行来调度我们的作业TestJob::dispatch(),因此出于测试目的,我将这一行直接放入我们的路由文件中,如下所示:

\n
Route::get(\'/\', function () {\n    //Run this job in the background and continue\n    \\App\\Jobs\\TestJob::dispatch();\n    //After job is started/Queued return view\n    return view(\'welcome\');\n});\n
Run Code Online (Sandbox Code Playgroud)\n

正如我从文档中了解到的那样,应该是这样,但它没有按我的预期工作。中的代码handle()被执行,但return view(\'welcome\');在作业完成后执行。

\n

我期望执行脚本,并在后台运行时执行下一行代码。如何让它在后台运行,以便用户不必等待脚本完成?

\n

我已经用谷歌搜索了很多,根据前面链接的教程,我应该有以下行:QUEUE_DRIVER=database\xe2\x80\x8b在我的 .env 文件中。我已经坐了这个,并且还在 Config\\queue.php 中使用了以下行:\'default\' => env(\'QUEUE_CONNECTION\', \'database\'),,但结果仍然相同

\n

我还在 SO(链接)上找到了 Laravel 5 的以下解决方案,其中建议我们还应该运行以下代码以使其正常工作:php artisan queue:listen,但结果又相同

\n

任何帮助将非常感激!

\n

ste*_*gwa 6

默认情况下该.env文件具有QUEUE_CONNECTION=sync.

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

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

  • 为此,只需更改QUEUE_CONNECTION=database您的.env文件即可。

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

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