resolute / laravel-pseudo-daemon
一个Laravel包,通过计划任务模拟守护进程,无需更改服务器配置。
Requires
- illuminate/support: ^8.0|^9.0|^10.0
Requires (Dev)
- mockery/mockery: ^1.3.3
- orchestra/testbench: ^5.0|^6.0|^7.0|^8.0
- phpunit/phpunit: ^8.5.23|^9.5
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()
都可供你使用。