wouterrr / minion-daemon
为 Kohana 的 Minion 任务提供守护进程
Requires
- php: >=5.3.0
- composer/installers: ~1.0
- kohana/core: >=3.3
- kohana/minion: 3.3.3.1
This package is not auto-updated.
Last update: 2024-09-21 14:35:54 UTC
README
minion-daemon 是 Kohana Minion 的扩展,用于轻松创建 PHP 工作守护进程。与随 minion 一起提供的 miniond 不同,minion-daemon 会在收到停止指令之前持续执行单个脚本。这使得它在某些场景中更加有用。
安装
minion-daemon 应该添加到您的 Kohana MODPATH 目录中。然后,在引导的 modules 部分中启用它。
要求
- kohana-minion 用于 CLI 界面
- minion-log 如果可用则使用
- 进程分叉和信号处理需要安装 pcntrl PHP 扩展。
- 某些测试需要安装 test_helpers 和 runkit PHP 扩展。如果不可用,则跳过测试。
兼容性
- 为 Kohana 3.2 编写。
使用方法
minion-daemon 仅是一个抽象类,并打算进行扩展。一个完整的示例在 classes/minion/example.php 中提供。
命令行选项
默认情况下,守护进程类具有以下选项
fork=(true|false)应该 PHP 分叉(守护进程化)进程吗?pid=/path/to/file设置 pidfile。可用于防止同时运行多个守护进程的副本
可以在扩展核心 Minion_Task_Daemon 类的任务中添加其他选项。
示例
minion worker:test --fork=true --pid=/tmp/minion-daemon.pid
控制信号
守护进程会响应接收到的任何控制信号,并将优雅地退出。在后台(例如,脚本尚未分叉时)这意味着当调用 ctrl-x 时,它将优雅地退出。
扩展 minion-daemon(例如,编写守护进程)
为您的自己的工作任务扩展 Minion_Daemon。 Minion_Daemon 又扩展了 Minion_Task。
设置/撤销
在第一次调用主要 loop 之前,minion-daemon 将运行一个公共的 before 方法,该方法将传递标准的 minion $config 参数。使用此方法进行任何设置或一次性初始化,这些初始化需要发生。
在主要 loop 结束后,将调用 after 方法。用于进行任何撤销或清理操作。即使收到 SIGQUIT 或其他停止信号,也会调用此方法。
循环
这是主要的魔法。 loop 将会持续调用,直到您告诉它退出(通过调用 $this->terminate() 或简单地从循环中返回 FALSE)。
脚本将在循环调用之间休眠,以便让处理器休息。您可以通过在您的类中定义 protected $_sleep 来设置休眠时间。$_sleep 以毫秒为单位,默认时间为 1 秒。如果您想连续运行而不中断(例如,为在端口上监听的服务器),请将其设置为 0。
处理错误
默认情况下,在循环中抛出的任何异常都将被记录,并且循环将终止。如果您希望即使在发生异常的情况下也继续循环,请在您的类中将 $_break_on_exception 设置为 FALSE。当然,您也可以使用一些传统的 try-catch 逻辑。
清理
每执行n次循环,就会调用一次清理方法。这个方法执行一些清理任务,例如强制PHP进行垃圾回收,强制Kohana输出日志缓冲区,清除statcache等。这些清理任务在长时间运行的脚本中尤其重要。根据需要,您可以扩展此方法。
为了控制_cleanup函数被调用的频率,设置$_cleanup_iterations。默认情况下,它将在loop的每次100次迭代中运行一次。
当调用_cleanup时,内存使用情况也会被写入日志。这是一种跟踪脚本随时间变化的方法,并(希望)捕捉到任何内存泄漏。
心跳
每次循环都会调用一次heartbeat()方法。技术上讲,这是多余的,因为我们可以将任何在heartbeat()中可以做的事情也在主loop中做。然而,它存在是为了强制良好的编程实践和代码分离。使用心跳来例如设置数据库中的一个值,让其他脚本/进程知道您的作业仍在运行。
日志记录
调用$this->_log()从您的守护程序中记录事件。参数与Kohana::$log->add();相同。默认情况下,minion-daemon附加了标准文件写入器以及StdOut作为写入器。如果可用,它将使用minion-log。否则,它将使用Kohana::$log。
如果您想在守护程序内部更改日志写入器/读取器,请使用$this->_logger。例如:$this->_logger->attach(new Log_File(APPPATH.'logs/daemon'))
技巧和窍门
- 请记住,minion守护程序创建了一个长时间运行的PHP进程。PHP实际上并不是为此而设计的,可能还有更好的选择。话虽如此,如果您使用PHP运行守护程序,请确保您很好地处理内存(取消未使用的对象等)。
- minion-daemon是Pagodabox上的一个出色的工作者:Pagodabox :)
测试
此模块使用unittest模块进行单元测试。您可以使用minion.tasks.daemon组仅运行minion守护程序测试。它还分为minion和minion.tasks组。
即。
phpunit --group minion.tasks.daemon
有错误?有疑问?
这就是为什么它托管在GitHub上的原因:)。请随意分叉它,提交问题或拉取请求。
谢谢
感谢antmat建议使用pid文件!
许可
此软件受与Kohana相同的许可证约束。