wouterrr/minion-daemon

为 Kohana 的 Minion 任务提供守护进程

安装: 15

依赖: 0

建议者: 0

安全性: 0

星标: 1

关注者: 2

分支: 7

开放问题: 0

类型:kohana-module

dev-3.3/develop 2019-04-28 14:20 UTC

This package is not auto-updated.

Last update: 2024-09-21 14:35:54 UTC


README

minion-daemonKohana Minion 的扩展,用于轻松创建 PHP 工作守护进程。与随 minion 一起提供的 miniond 不同,minion-daemon 会在收到停止指令之前持续执行单个脚本。这使得它在某些场景中更加有用。

安装

minion-daemon 应该添加到您的 Kohana MODPATH 目录中。然后,在引导的 modules 部分中启用它。

要求

兼容性

  • 为 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_DaemonMinion_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守护程序测试。它还分为minionminion.tasks组。

即。

phpunit --group minion.tasks.daemon

有错误?有疑问?

这就是为什么它托管在GitHub上的原因:)。请随意分叉它,提交问题或拉取请求。

谢谢

感谢antmat建议使用pid文件!

许可

此软件受与Kohana相同的许可证约束。