【问题标题】:Laravel queue randomly not dispatchingLaravel 队列随机不调度
【发布时间】:2021-08-13 09:55:29
【问题描述】:

我正在尝试从控制器分派作业,但有时队列工作,有时它会立即执行代码。另一方面,从命令调度工作正常,所以我想知道有什么区别。

我尝试过的事情:

  • 我尝试了数据库和 Redis 连接,但都遇到了问题
  • 不运行队列listen/work,作业会随机执行,所以listen/work不是问题
  • 检查网络服务器/PHP 日志是否有错误,没有结果
  • 在静态调度函数之前出现了问题。 当我在静态调度函数中放置一个die时,它有时会杀死应用程序,有时它仍然会立即在句柄中运行解码......

vendor/laravel/framework/src/Illuminate/Foundation/Bus/Dispatchable.php

public static function dispatch()
{
    die('xxx');
    
    return new PendingDispatch(new static(...func_get_args()));
}

我试图找出在调度函数之前发生了什么,但我找不到任何在静态句柄函数之前执行的函数。我感觉 PHP 发生了崩溃,或者立即执行该作业,但我找不到核心发生的位置。

控制器

class CreateTestJob
{
    public function __invoke(Request $request)
    {
        TestJob::dispatch(rand(0, 999999));
    }
}

工作

class TestJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public function __construct($test)
    {
        $this->test = $test;
    }

    public function handle()
    {
        sleep(30);

        echo 'done';
    }
}

我还尝试在 TestJob 的 de 句柄函数中创建语法错误,以便我可以看到堆栈跟踪,但它显示“1 个未知帧”。我想知道那是什么

【问题讨论】:

  • 如果你使用“sync”驱动调度,发生了什么?您的队列使用什么驱动程序?您确定问题出在调度而不是处理程序上吗?
  • 另外,你能否实现“failed_job”表来检查这里是否报告了任何问题,或者在 laravel 日志中,或者在 webserver/php 日志中?你有任何速率限制吗?或者您的工作延迟/超时的特定配置?你如何执行任务?另一个服务器?导师?只是用于测试的 CLI?哪个命令?
  • 静态函数dispatch()不接受任何参数。
  • @Mtxz 当我使用同步驱动程序时,它将立即执行代码。 failed_job 中没有任何内容,因为它将立即运行代码,这意味着它不使用队列。 web/php 日志中没有错误。我使用了 php artisan queue:work 和 php artisan queue:listen 在 cli 和 supervisor。
  • 您的环境中是否有任何可能导致您的代码出现多个可能已经过时的情况,例如 Opcache 或集合/负载均衡器?

标签: php laravel


【解决方案1】:
  1. 如果在运行作业时出现任何错误,您可以检查 fail_jobs 表。

  2. 只有在使用同步驱动或同步调度时才会立即执行作业(用于本地开发)。

    <?php Somejob::dispatchSync();

  3. Redis 和数据库连接上的作业只有在您运行 queue worker 时才会执行。

    php artisan queue:work

【讨论】:

    猜你喜欢
    • 2018-06-18
    • 2021-10-09
    • 2019-01-01
    • 1970-01-01
    • 2020-10-04
    • 2018-03-15
    • 2019-09-13
    • 2021-08-06
    • 2020-09-19
    相关资源
    最近更新 更多