laravel队列生成`illuminate:queue:重新启动`continuously

zazmityj  于 2021-06-10  发布在  Redis
关注(0)|答案(1)|浏览(512)

ive laravel队列正在运行,但在数据库连接上,以下是配置:

'database' => [
    'driver' => 'database',
    'connection' => 'mysql',
    'table' => 'jobs',
    'queue' => 'default',
    'retry_after' => 190,
    'block_for' => 0,
]

我是这样运行的:

php artisan queue:work --queue=xyz_queue > storage/logs/queue.log

在redis cli上,这是每秒发生的事情:

k3bvogb1

k3bvogb11#

这是正常和预期的行为。根据文件
由于队列工作进程是长寿命的进程,因此它们不会在不重新启动的情况下获取对代码的更改。因此,使用队列工作者部署应用程序的最简单方法是在部署过程中重新启动工作者。您可以通过发出queue:restart command: php artisan queue:restart 此命令将指示所有队列工作人员在完成当前作业的处理后优雅地“死亡”,以便不会丢失现有作业。
什么 queue:restart 是否将当前时间戳设置为 illuminate:queue:restart 钥匙。
当队列即将被进程占用时( php artisan queue:work )它从 illuminate:queue:restart 在作业即将完成后,它将从同一个键再次获取值。
它比较处理作业前的值与处理作业后的值是否相同。
如果它是不同的,那么它将停止长寿命的过程。
这是一种有效的方法(因为redis对于这种场景来说速度非常快),可以检测代码是否发生了更改,以及是否应该为代码的更改更新作业。
它将值保存到redis中的原因,“很可能”您的缓存驱动程序是redis。如果你把它改成 file 然后它将保存在文件中,并对该文件发出get请求。
以下是相关方法;

protected function stopIfNecessary(WorkerOptions $options, $lastRestart, $job = null)
{
    if ($this->shouldQuit) {
        $this->stop();
    } elseif ($this->memoryExceeded($options->memory)) {
        $this->stop(12);
    } elseif ($this->queueShouldRestart($lastRestart)) {
        $this->stop();
    } elseif ($options->stopWhenEmpty && is_null($job)) {
        $this->stop();
    }
}

protected function queueShouldRestart($lastRestart)
{
    return $this->getTimestampOfLastQueueRestart() != $lastRestart;
}

protected function getTimestampOfLastQueueRestart()
{
    if ($this->cache) {
        return $this->cache->get('illuminate:queue:restart');
    }
}

相关问题