Laravel - 安排队列 returns 共享主机上出现 503 错误
Laravel - Schedule queues returns a 503 error on shared hosting
我在 laravel 中有一个应用程序要发送几封电子邮件,其中一些电子邮件必须等待一段时间才能发送。
所以我使用的是队列数据库类型,在本地主机中我 运行 命令 php artisan schedule:run
运行 是这个命令:
$schedule->command('queue:work')->everyMinute();
并且工作完美。
现在我将项目传递给 cpanel 共享主机并传递给 运行 我创建一个 cron job
的计划命令。
/usr/local/bin/php /path to project/artisan schedule:run
因为我需要时刻关注是否需要发送电子邮件,所以我每分钟定义 运行 一个 cron 作业,并在前 5 或 10 分钟内开始工作。
接下来我开始从服务器收到 503
错误,因为我到达进程的时间可能是因为 cron 作业执行。现在服务器将关闭 24 小时。
我该如何解决?什么是更好的解决方案?
谢谢
我使用共享主机并遇到了类似的问题。如果您的托管服务接受 php 命令 shell_exec()
您可以这样做。
protected function schedule(Schedule $schedule)
{
if (!strstr(shell_exec('ps xf'), 'php artisan queue:work'))
{
$schedule->command('queue:work --timeout=60 --tries=1')->everyMinute();
}
}
您的 cron 作业似乎没问题。顺便说一下,如果您的托管服务器 24 小时宕机,您可以考虑换个主机我的朋友。
queue:work
是一个漫长的 运行 过程。此检查确保它在您的服务器上 运行。它会听取您的队列并完成工作。这也意味着,如果您对生产文件进行了更改,工作人员将不会接受这些更改。看看我的 top -ac
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2398733 user 20 0 466m 33m 12m S 0.0 0.1 0:03.15 /opt/alt/php72/usr/bin/php artisan queue:work --timeout=60 --tries=1
2397359 user 20 0 464m 33m 12m S 0.0 0.1 0:03.04 /usr/local/bin/php /home/user/booklet/artisan schedule:run
2398732 user 20 0 105m 1308 1136 S 0.0 0.0 0:00.00 sh -c '/opt/alt/php72/usr/bin/php' 'artisan' queue:work --timeout=60 --tries=1 >> '/home/user/booklet/storage/queue.log' 2>&1
如您所见,worker 在上面,另一个进程只是将它所做的一切写入日志文件。在为您的生产服务器创建新的 uploads/changes 后,您必须 kill 2398733
。该过程将在 5 分钟内自行重新启动。因为 schedule:run
cron 作业。
2019 年 10 月更新
protected function schedule(Schedule $schedule)
{
if (!strstr(shell_exec('ps xf'), 'php artisan queue:work'))
{
$schedule->command('queue:work --timeout=60 --tries=1')->withoutOverlapping();
}
}
->withoutOverlapping()
方法在后台推送进程命令。它确保 artisan Schedule
命令正确退出。
您可以在 cron 任务中使用 withoutOverlapping
来防止这种情况发生。
By default, scheduled tasks will be run even if the previous instance of the task is still running. To prevent this, you may use the withoutOverlapping method:
$schedule->command('emails:send')->withoutOverlapping();
https://laravel.com/docs/5.7/scheduling#preventing-task-overlaps
这样,如果 queue:work
任务因某种原因失败,您的 cron 将重新启动该任务,但不会启动它的多个实例。
我在 laravel 中有一个应用程序要发送几封电子邮件,其中一些电子邮件必须等待一段时间才能发送。
所以我使用的是队列数据库类型,在本地主机中我 运行 命令 php artisan schedule:run
运行 是这个命令:
$schedule->command('queue:work')->everyMinute();
并且工作完美。
现在我将项目传递给 cpanel 共享主机并传递给 运行 我创建一个 cron job
的计划命令。
/usr/local/bin/php /path to project/artisan schedule:run
因为我需要时刻关注是否需要发送电子邮件,所以我每分钟定义 运行 一个 cron 作业,并在前 5 或 10 分钟内开始工作。
接下来我开始从服务器收到 503
错误,因为我到达进程的时间可能是因为 cron 作业执行。现在服务器将关闭 24 小时。
我该如何解决?什么是更好的解决方案?
谢谢
我使用共享主机并遇到了类似的问题。如果您的托管服务接受 php 命令 shell_exec()
您可以这样做。
protected function schedule(Schedule $schedule)
{
if (!strstr(shell_exec('ps xf'), 'php artisan queue:work'))
{
$schedule->command('queue:work --timeout=60 --tries=1')->everyMinute();
}
}
您的 cron 作业似乎没问题。顺便说一下,如果您的托管服务器 24 小时宕机,您可以考虑换个主机我的朋友。
queue:work
是一个漫长的 运行 过程。此检查确保它在您的服务器上 运行。它会听取您的队列并完成工作。这也意味着,如果您对生产文件进行了更改,工作人员将不会接受这些更改。看看我的 top -ac
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2398733 user 20 0 466m 33m 12m S 0.0 0.1 0:03.15 /opt/alt/php72/usr/bin/php artisan queue:work --timeout=60 --tries=1
2397359 user 20 0 464m 33m 12m S 0.0 0.1 0:03.04 /usr/local/bin/php /home/user/booklet/artisan schedule:run
2398732 user 20 0 105m 1308 1136 S 0.0 0.0 0:00.00 sh -c '/opt/alt/php72/usr/bin/php' 'artisan' queue:work --timeout=60 --tries=1 >> '/home/user/booklet/storage/queue.log' 2>&1
如您所见,worker 在上面,另一个进程只是将它所做的一切写入日志文件。在为您的生产服务器创建新的 uploads/changes 后,您必须 kill 2398733
。该过程将在 5 分钟内自行重新启动。因为 schedule:run
cron 作业。
2019 年 10 月更新
protected function schedule(Schedule $schedule)
{
if (!strstr(shell_exec('ps xf'), 'php artisan queue:work'))
{
$schedule->command('queue:work --timeout=60 --tries=1')->withoutOverlapping();
}
}
->withoutOverlapping()
方法在后台推送进程命令。它确保 artisan Schedule
命令正确退出。
您可以在 cron 任务中使用 withoutOverlapping
来防止这种情况发生。
By default, scheduled tasks will be run even if the previous instance of the task is still running. To prevent this, you may use the withoutOverlapping method:
$schedule->command('emails:send')->withoutOverlapping();
https://laravel.com/docs/5.7/scheduling#preventing-task-overlaps
这样,如果 queue:work
任务因某种原因失败,您的 cron 将重新启动该任务,但不会启动它的多个实例。