通过 CRON

问题描述

我正在运行一个基于 Laravel 8 的应用程序。这个应用程序处理大量的工作。这就是为什么我的队列存储在 Redis 中并由 Laravel Horizo​​n 处理的原因。

由于我在共享主机上,我无法访问 Supervisord(或任何进程管理器)。

我向社区询问是因为我找不到关于我的案例的首选配置的任何建议或建议。

CRON

* * * * * PHP artisan schedule:run >/dev/null 2>&1

控制台/Kernel.PHP

$schedule->command('horizon')->everyMinute()->withoutOverlapping();

通过 CRON 保持 Horizo​​n 活跃的首选方法是什么?

防止 Horizo​​n 重复进程(并防止内存泄漏)的首选方法是什么?

解决方法

由于您可以运行 cron 作业,您可以创建一个文件“start_horizo​​n.php”:

<?php declare(strict_types=1);

$res = shell_exec("php artisan horizon:status");

if($res !== "Horizon is running.\n") {
    echo "horizon is not running,starting it\n";
    $fp = popen("php artisan horizon","r");
    while (!feof($fp)) {
        $buffer = fgets($fp,4096);
        echo $buffer;
    }
    echo "horizon was terminated\n";
    pclose($fp);
} else {
    echo "horizon is running\n";
}

并且每隔一分钟左右从 cron 调用它。此脚本将检查地平线是否正在运行。如果地平线正在运行,它将退出。如果地平线未运行,它将启动地平线。

cron 行应如下所示:

* * * * * cd /your/laravel/dir/ && php start_horizon.php >> /dev/null

需要在 artisan 可用的目录中运行此脚本。