hammerstone / 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伪守护进程
一个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()
。