hammerstone/laravel-pseudo-daemon

一个Laravel包,用于通过计划命令模拟守护进程,无需更改服务器配置。

v1.1.0 2023-04-13 14:08 UTC

This package is auto-updated.

Last update: 2024-09-11 23:30:20 UTC


README

你可能现在应该使用框架内置的 分钟级计划任务,而不是这个包。我会在某个时候将其标记为废弃!

Laravel伪守护进程

一个Laravel包,用于通过计划命令模拟守护进程,无需更改服务器配置。

有关更多信息/原因,请参阅 https://aaronfrancis.com/2020/laravel-pseudo-daemons.

安装

您可以通过composer安装此包

composer require Hammerstone/laravel-pseudo-daemon

基本用法

IsPseudoDaemon特质添加到您的Laravel命令之一,并在handle方法中调用runAsPseudoDaemon

class TestCommand extends Command
{
    use \Hammerstone\PseudoDaemon\IsPseudoDaemon;

    public function handle()
    {
        $this->runAsPseudoDaemon();
    }

    /**
     * This is the main method that will be kept alive.
     */
    public function process()
    {
        // All of your processing...
    }
}

然后,在您的Console\Kernel中,使用daemonize修饰符运行您的命令。这是一个宏,将其设置为每分钟运行一次,在后台运行,不会重叠。

// Kernel.php

// Use the daemonize macro.
$schedule->command('test')->daemonize();

// Or use the underlying methods.
$schedule->command('test')
    ->everyMinute()
    ->runInBackground()
    ->withoutOverlapping();

process方法将保持活动状态,直到您想要的时间,所有这些都由您的代码控制,无需任何Supervisor配置,也无需更改您的部署脚本来将其终止。

停止守护进程

显然,有些时候您需要终止您的守护进程,以便调度器可以重新启动它。最明显的情况是在部署新代码时,但还有许多其他原因需要终止它,也有几种方法可以做到这一点。

运行次数后重启

如果您希望在守护进程运行一定次数后停止它,可以覆盖restartAfterNumberOfTimesRun方法。默认情况下,在生产环境中返回1000,在其他情况下返回1

分钟后重启

要设置最大运行时间(分钟),覆盖restartAfterMinutes。默认情况下,所有守护进程都运行60分钟。

当某些任意更改发生时重启

您希望在部署新代码时终止您的守护进程,这可以通过restartWhenChanged方法轻松完成。您可以从该方法返回任何数据,如果它发生变化,守护进程将停止。

Forge + Envoyer

如果您正在使用Laravel Forge和Envoyer,则特质将自动处理在部署新代码时终止自己。您不需要做任何事情!特质将读取Envoyer创建的current符号链接的真实路径。如果该路径发生变化,守护进程将停止。

其他托管

如果您不在Forge和Envoyer上,可以扩展restartWhenChanged方法并返回您想要的任何内容。您可以读取git哈希、构建时间或执行其他任何操作。每当检测到数据发生变化时,循环就会中断。

以下是一个读取当前git哈希的示例

public function restartWhenChanged()
{
    // Restart whenever the git hash changes.
    // https://stackoverflow.com/a/949391/1408651
    return shell_exec('git rev-parse HEAD');
}

随时停止

如果您想在process方法中启动停止,可以返回PseudoDaemonControl::STOP,则守护进程将不再运行更多迭代。

睡眠

为了确保您的守护进程在没有要做的事情时不会每分钟运行数千次,我们默认在迭代之间睡眠7秒。如果您想更改这个数量,可以覆盖pseudoDaemonSleepSeconds

如果您想在某个迭代中明确不睡眠,您可以从您的 process 方法返回 PseudoDaemonControl::DONT_SLEEP

在运行前后代码

如果您想在主循环之外执行一些设置和/或清理操作,您可以使用 beforePseudoDaemonRun()beforePseudoDaemonShutdown()