Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel-调度队列在共享主机上返回503错误_Php_Laravel_Cron_Http Status Code 503 - Fatal编程技术网

Php Laravel-调度队列在共享主机上返回503错误

Php Laravel-调度队列在共享主机上返回503错误,php,laravel,cron,http-status-code-503,Php,Laravel,Cron,Http Status Code 503,我在laravel有一个应用程序,它会发送几封电子邮件,其中一些电子邮件需要等待一段时间才能发送 因此,我使用队列数据库类型,并在localhost中运行命令php artisan schedule:run,该命令运行以下命令: $schedule->command('queue:work')->everyMinute(); 而且效果很好 现在,我将项目传递给一个cpanel共享主机,为了运行schedule命令,我创建了一个cron作业 /usr/local/bin/php /p

我在laravel有一个应用程序,它会发送几封电子邮件,其中一些电子邮件需要等待一段时间才能发送

因此,我使用队列数据库类型,并在localhost中运行命令
php artisan schedule:run
,该命令运行以下命令:

$schedule->command('queue:work')->everyMinute();
而且效果很好

现在,我将项目传递给一个cpanel共享主机,为了运行schedule命令,我创建了一个
cron作业

/usr/local/bin/php /path to project/artisan schedule:run
因为我需要时刻关注是否需要发送电子邮件,所以我定义每分钟运行一个cron作业,并在前5或10分钟内工作

接下来,我开始从服务器接收到一个
503
错误,因为我到达了进程的末尾,可能是因为cron作业的执行。现在服务器将关闭24小时

我怎样才能解决这个问题?什么是更好的解决方案


谢谢

我使用共享主机,但也遇到了类似的问题。如果您的托管服务接受php命令
shell\u 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小时,你可以考虑另一个主机我的朋友。
队列:工作
是一个长时间运行的过程。此检查确保它在您的服务器上运行。它将侦听您的队列并执行任务。这还意味着,如果您对生产文件进行了更改,工人将不会接受更改。查看我的
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位于顶部,另一个进程只是将它所做的一切写入日志文件。在对prod服务器进行新的上传/更改后,您必须
杀死2398733
。进程将在不到5分钟内自行重新启动。由于
计划:运行
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方法:

$schedule->command('emails:send')->withoutOverlapping();


这样,如果由于某种原因失败,您的cron将重新启动
队列:work
任务,但它不会启动多个实例。

共享主机可能没有运行这些命令的正确权限/访问权限。停止使用共享托管。那么,您是在告诉我维护cron作业并将shell_exec()添加到内核文件中的调度函数中@是的。在我的共享服务器上,我和你有同样的问题。这个变通方法解决了这个问题。好的,还有一个问题。假设我有5封电子邮件在队列中,第三封电子邮件必须等待3分钟才能发送。使用此代码,它将首先发送4封电子邮件,对吗@是的<代码>队列:工作是一个长时间运行的过程。这个小检查确保它在服务器上运行。您无法通过ssh批处理命令真正运行此进程。如果停止命令(ctrl+c),请关闭连接或批处理程序,
queue:work
。这也是为什么不能将其作为cron作业运行的原因。它将超时并自动终止进程。