【问题标题】:Laravel 8, how to run a job (script) in the background?Laravel 8,如何在后台运行作业(脚本)?
【发布时间】: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.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 (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


【解决方案1】:

默认.env文件有QUEUE_CONNECTION=sync

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

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

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

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

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

【讨论】:

  • 我没有注意到 .env 中的 'QUEUE_CONNECTION' 行,但是将其更改为 'database' 使其按预期工作,非常感谢。我猜 'QUEUE_DRIVER' 是针对旧版本的 Laravel 的?
  • @MichaelJorgensenDK ,这是正确的。不客气。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 2017-05-23
相关资源
最近更新 更多