12

我希望我的 laravel queue:work 继续在共享主机上运行,​​这是一个共享主机(不在 VPS 上)我无法安装任何东西,因为在我搜索此内容时几乎所有在线资源都建议安装主管。所以基本上我想我可以创建一个 cron 作业来检查队列是否没有运行并启动它,关于如何解决这个问题的任何帮助,因为我有点卡住了,谢谢。

PS Am 在 Linux 服务器和 Laravel 5.3 上

4

8 回答 8

16

正如您所提到的,您使用的是共享主机,请按照以下步骤操作。

第 1 步。 您需要将队列驱动程序设置为database

第 2 步 ,您需要使用以下命令设置 cron 作业 php /path/to/application/artisan queue:work --queue=high,default

你可以试一试。我希望它会奏效。

于 2017-09-10T14:21:41.453 回答
4

这是搜索了几天后对我有用的解决方案。

flock -n /tmp/latavel_queues.lockfile /usr/bin/php /path/to/laravel/artisan queue:listen

请参阅https://laracasts.com/discuss/channels/servers/database-queue-on-shared-hosting

于 2018-05-12T14:19:26.340 回答
3

最好的方法是在你的面板任务上设置followin命令(我正在使用plesk控制面板,它使我能够在那里设置任务)

php artisan queue:work --once

注意:在我的共享主机中,由于它们的服务器配置,我必须设置以下值:

  1. php: /opt/plesk/php/7.2/bin/php -q
  2. 工匠: /var/www/vhosts/t4f.ir/httpdocs/artisan
  3. 我的命令:那么我应该写命令

所以,结果会是这样的:

/opt/plesk/php/7.2/bin/php -q /var/www/vhosts/t4f.ir/httpdocs/artisan queue:work --once

运行时还有另一个选项,我将其设置为 Cron 类型,值为:* * * * *这意味着每分钟都会执行此代码。当我在我的命令末尾使用 --once 时,一旦它执行命令并且作业完成,它将被终止。关于并发执行,我不担心,因为它是在排队系统中处理的,它是这个系统的责任。

于 2019-10-23T23:47:37.953 回答
3

使用 Laravel 8,您可以选择--max-time允许queue:work它在一段时间后停止作业处理。

php artisan queue:work --max-time=300

您可以设置一个 cron 作业,例如,每 5 分钟运行一次作业处理,并将该--max-time选项设置为 5 分钟(300 秒)。在这种情况下,cron 将运行作业处理,300 秒queue:work后将退出,几秒钟后,cron 将再次运行作业处理,依此类推。

于 2021-03-26T17:23:02.407 回答
2

尝试添加两个 cron 作业:

  1. 清除缓存:
/usr/local/bin/php /home/<path-to-project>/artisan cache:clear
  1. 运行调度程序
/usr/local/bin/php /home/<path-to-project>/artisan schedule:run

另外,请确保您的 app\Console\Kernel.php 有类似的东西

protected function schedule(Schedule $schedule)
    {
        $schedule->command('queue:work --tries=3')
            ->cron('* * * * *')
            ->withoutOverlapping(5);
    }

如果队列开始工作,则删除第一个作业(要删除缓存的作业)

于 2020-11-23T07:24:54.750 回答
2

另一种解决方案(我以这种方式解决了同样的问题)。你可以像这样制作脚本:

# getting running processes with name "queue:work"
QUEUE_STATUS=$(ps aux | grep "queue:work")

# check is queue:work started, if no, start it
if $( echo $QUEUE_STATUS | grep --quiet 'artisan queue:work')
then
    exit;
else
    php ~/public_html/artisan queue:work
fi

并在 CRON 中运行它。我每10分钟跑一次。

于 2019-02-04T10:49:10.180 回答
0

// 第 1 步:运行调度程序

/usr/local/bin/php /home/USERNAME/public_html/PROJECT_FOLDER/artisan schedule:run >> /dev/null 2>&1

// kernel.php 中的第 2 步

protected function schedule(Schedule $schedule)
    {
        $schedule->command('queue:work', [
        '--max-time' => 300
        ])->withoutOverlapping();

//第3步测试它。;)

于 2021-09-22T10:48:21.320 回答
0

我想出了一个技巧来完成这个

在文件中Illuminate\Queue\Worker.php,我当前的 laravel 版本(5.3)在第 151 行;在功能上runNextJob($connectionName, $queue, WorkerOptions $options)添加else如下

if ($job) {
    return $this->process(
        $connectionName, $job, $options
    );
 } else {
    $this->stop();
}

现在创建 cron 作业,该作业将在队列耗尽时使用命令运行您喜欢的次数php artisan queue:work,它将退出(但应该因为进程存在而频繁)

更新:如果命令已经运行,则使用任务计划withoutOverlapping()可以防止进一步调用命令,因此这是一个更好的选择,因为前一个是您每次都必须进行的更改composer installcomposer update

于 2017-09-11T01:46:41.873 回答