resolute/laravel-pseudo-daemon

此包已被 废弃 且不再维护。作者建议使用 hammerstonedev/laravel-pseudo-daemon 包。

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

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

This package is auto-updated.

Last update: 2023-07-11 21:02:36 UTC


README

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

Laravel Pseudo-Daemons

一个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() 都可供你使用。