我希望我的 laravel queue:work 继续在共享主机上运行,这是一个共享主机(不在 VPS 上)我无法安装任何东西,因为在我搜索此内容时几乎所有在线资源都建议安装主管。所以基本上我想我可以创建一个 cron 作业来检查队列是否没有运行并启动它,关于如何解决这个问题的任何帮助,因为我有点卡住了,谢谢。
PS Am 在 Linux 服务器和 Laravel 5.3 上
我希望我的 laravel queue:work 继续在共享主机上运行,这是一个共享主机(不在 VPS 上)我无法安装任何东西,因为在我搜索此内容时几乎所有在线资源都建议安装主管。所以基本上我想我可以创建一个 cron 作业来检查队列是否没有运行并启动它,关于如何解决这个问题的任何帮助,因为我有点卡住了,谢谢。
PS Am 在 Linux 服务器和 Laravel 5.3 上
正如您所提到的,您使用的是共享主机,请按照以下步骤操作。
第 1 步。
您需要将队列驱动程序设置为database
第 2 步
,您需要使用以下命令设置 cron 作业
php /path/to/application/artisan queue:work --queue=high,default
。
你可以试一试。我希望它会奏效。
这是搜索了几天后对我有用的解决方案。
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
最好的方法是在你的面板任务上设置followin命令(我正在使用plesk控制面板,它使我能够在那里设置任务)
php artisan queue:work --once
注意:在我的共享主机中,由于它们的服务器配置,我必须设置以下值:
所以,结果会是这样的:
/opt/plesk/php/7.2/bin/php -q /var/www/vhosts/t4f.ir/httpdocs/artisan queue:work --once
运行时还有另一个选项,我将其设置为 Cron 类型,值为:* * * * *这意味着每分钟都会执行此代码。当我在我的命令末尾使用 --once 时,一旦它执行命令并且作业完成,它将被终止。关于并发执行,我不担心,因为它是在排队系统中处理的,它是这个系统的责任。
使用 Laravel 8,您可以选择--max-time
允许queue:work
它在一段时间后停止作业处理。
php artisan queue:work --max-time=300
您可以设置一个 cron 作业,例如,每 5 分钟运行一次作业处理,并将该--max-time
选项设置为 5 分钟(300 秒)。在这种情况下,cron 将运行作业处理,300 秒queue:work
后将退出,几秒钟后,cron 将再次运行作业处理,依此类推。
尝试添加两个 cron 作业:
/usr/local/bin/php /home/<path-to-project>/artisan cache:clear
/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);
}
如果队列开始工作,则删除第一个作业(要删除缓存的作业)
另一种解决方案(我以这种方式解决了同样的问题)。你可以像这样制作脚本:
# 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分钟跑一次。
// 第 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步测试它。;)
我想出了一个技巧来完成这个
在文件中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 install
或composer update