vladimirgs / laravel-daemon
一个为 Laravel 提供守护进程命令的包。
Requires
- php: ^7.4|^8.0|^8.1
- hashids/hashids: ^4.1
- illuminate/support: ~7|~8|~9|~10
Requires (Dev)
- orchestra/testbench: ~5|~6
- phpunit/phpunit: ~9.0
README
此包允许您构建长时间运行的命令/守护进程。当您需要比 Laravel 调度(即频率高于 1 分钟)更高的频率运行某些内容时,这可能很有用。
安装
composer require vladimirgs/laravel-daemon
创建守护进程
要创建守护进程,请运行
php artisan make:daemon
这将在 app/Console/Commands/Daemons 中创建一个新的文件。该 Daemon 抽象类扩展了正常的 Laravel 命令,因此正常 Laravel 命令中的底层方法仍然可用。
添加功能
守护进程和正常命令之间的唯一区别是,逻辑现在进入 work(): void 方法而不是 handle() 方法。
例如,一个基本的示例,它只是将 hello 打印到控制台
public function work(): void
{
$this->info('Hello');
}
您可以通过访问 $this->runs 获取当前迭代编号。
您可以通过向工作方法添加参数来使用 Laravel 的依赖注入。
设置
您可以使用 setUp(): void 方法在守护进程启动之前执行一些操作,例如解析传递给命令的参数和选项。这类似于在 PHPUnit 测试用例中使用的 setUp 方法。
public function setUp(): void
{
//
}
清理
您可以使用 tearDown(): void 方法在守护进程完成后执行一些操作,这类似于在 PHPUnit 测试用例中使用的 tearDown 方法。
public function tearDown(): void
{
//
}
输出
上述示例的输出是
[2021-08-06 13:45:26.140] - V5wkJjo - Starting daemon
[2021-08-06 13:45:26.140] - V5wkJjo:a8c17bd - Hello
[2021-08-06 13:45:27.141] - V5wkJjo:7f48899 - Hello
[2021-08-06 13:45:28.141] - V5wkJjo:07e9cbd - Hello
[2021-08-06 13:45:29.142] - V5wkJjo:e69bc62 - Hello
您会注意到所有输出都带有时间戳和看似随机的字符。这些随机字符是实例和批次 ID。当您运行多个相同守护进程的实例并需要过滤日志时,这很有用。您可以通过使用 getInstanceId() 和 getBatchId() 方法访问这两个值。
选项
运行循环一次
有时您可能只想运行循环一次,为此您可以在运行命令时添加 --once 标志。
注意:这具有比 --until-complete 标志更高的优先级。
运行直到完成
类似地,您可能希望守护进程在完成正在执行的工作后继续运行,您可以通过使用 --until-complete 标志来完成此操作。为此,您需要在 work() 方法中的某个位置调用 $this->completed() 方法。
重启守护进程
根据您的项目托管方式,当新代码部署时,您可能需要重启守护进程工作者。您可以通过运行 php artisan daemon:restart 来执行此操作。这与 php artisan queue:restart 的工作方式相同,即进程退出 - 您应该使用进程管理器,该管理器将自动重启守护进程工作者。
配置
睡眠
在每次迭代之后,守护进程将暂停,然后再继续。默认暂停时间为 1 秒,但您可以使用 DAEMON_SLEEP 环境变量来覆盖此设置。这以秒为单位,并且是一个浮点数,例如 0.1。
或者,您可以通过在运行时使用标志来覆盖此设置:--sleep=0.1。