theintz/php-daemon

创建稳定的、长时间运行的 PHP 守护进程。这是 shaneharter/php-daemon 的分支。

3.0.1 2016-08-19 08:26 UTC

README

通过扩展 Core_Daemon 类创建稳定的、长时间运行的 PHP 守护进程。使用内置计时器以每秒或亚秒频率运行应用程序,或使用 Socket 和 LibEvent 等库构建服务器。创建传统的单进程应用程序或选择在 PHP 中使用持久后台工作进程进行真正的并行处理。

注意:由于多种原因,PHP 不是创建服务器或守护进程的最佳语言选择。我创建了此库,以便如果您 必须 使用 PHP 来完成这些工作,您可以轻松完成并产生出色的结果。但如果有选择,Java、Python、Ruby 等,都更适合这个任务。

要求

  • PHP 5.3 或更高版本
  • POSIX 兼容的操作系统(Linux、OSX、BSD)
  • PHP 的 POSIX 和 PCNTL 扩展

[新增] v2.2 的开发计划

[新增] 版本 2.1 已发布!

  • 经过 9 个月的测试版期,分支 feature_abstract_ipc 中的代码已合并到 master 作为 v2.1。
  • 版本 2.0 可在 v2.0 标签中找到。
  • 2.1 中的激动人心功能包括
    • 对 Worker API 进行了重大重构,包括可插拔的 IPC 类:通过任何流行的消息队列或坚持使用内置的 SysV 通道进行通道工作进程通信。
    • 改进并简化了工作进程调试外壳,具有新的强大命令和更易于将自定义断点集成到您自己的工作进程代码中。
    • 将散布在 Core_DaemonCore_Worker_Mediator 类中的所有进程分叉、回收和管理代码集中到一个简单的 ProcessManager 插件中。
    • 核心守护进程和中介类中的数十个其他错误修复和改进,使代码更简单、更清晰。

##显著功能

  • ###我们提供事件循环:无需样板代码即可构建您的应用程序。您可以从开箱即用的应用程序开始。一旦扩展 Core_Daemon 并实现 3 个抽象方法(它们可以是空的),您就有一个可工作的原型。

  • ###阻塞或时钟:1 行代码即可选择。大多数守护进程应用程序要么使用阻塞 API 库(libevent、socket_listen 等),要么在每个 5 秒、每秒或每 5 次每秒的内部时钟上运行需要运行的代码。

    您可以使用 1 行代码实现时钟,或者将其留空以构建基于异步或阻塞 IO 的事件循环。

  • ###PHP 中的真正并行处理。只需几行代码即可创建异步后台进程,使您能够保持守护进程过程轻量级和响应灵敏。在传递对象到 Worker API 后,您可以像平常一样调用其方法。API 静默拦截您的方法调用并将其传递给在后台进程中运行的对象。调用在 Worker API 拦截它时返回,您的守护进程继续正常运行。当后台进程完成方法调用时,将触发您设置的任何 onReturn 回调。如果出现问题,您还有强制执行超时并轻松重试调用的能力。

    相对于持续运行、长时间运行的背景工作进程,Tasks API 为您提供了一种简单的方法来调用一个临时的背景进程中的任何方法,当您的操作完成后,该进程将退出。

    PHP Simple Daemon 工作进程和任务是 PHP 语言中非常少见的简单而强大的多进程工具。(但不要尝试构建 PHP 版本的 Node.js)

    https://github.com/shaneharter/PHP-Daemon/wiki/Worker-API

    https://github.com/shaneharter/PHP-Daemon/wiki/Task-API

  • ###集成调试工具 调试多进程应用程序通常非常痛苦,库中包含了几种集成调试工具。

    由于您不能在 xdebug 或 zend debugger 下运行此类应用程序,因此提供了一个调试控制台,允许您在代码中设置伪断点。您的守护进程变成了一个交互式外壳,让您可以继续或中止操作,以及一打以上的命令,以了解任何给定时间的确切情况。导出函数参数、eval() 自定义代码、打印堆栈跟踪,等等。

    除了集成调试控制台之外,/scripts 目录还包括一个有用的 signal_console 应用:附加到您的守护进程,并轻松发送和重发信号。查看 PrimeNumbers 应用程序,了解如何使用信号处理程序来模拟偶尔的真实世界事件。

    您还可以找到 shm_console 应用程序,它允许您附加到共享内存地址,扫描密钥,查看它们,甚至运行打印出创建、更新和删除事务日志的 watch 命令。

    https://github.com/shaneharter/PHP-Daemon/wiki/Debugging-workers

    https://github.com/shaneharter/PHP-Daemon/wiki/Debug-Tools

  • ###简单回调:因为解耦更好。一个简单的 jQuery 风格的 API 允许您将回调添加到守护进程的生命周期事件中(例如:启动、关闭、分支等),并创建自己的事件。使用 on() 添加事件监听器,使用 off() 移除它,并使用 dispatch() 创建自己的事件。与所有 PHP Simple Daemon API 一样,它接受闭包或任何有效的 PHP 回调。

    https://github.com/shaneharter/PHP-Daemon/wiki/Using-callbacks-and-custom-events

  • ###简单插件:因为代码重用更好。如果您更关注构建一个可重用组件,该组件能够在调用应用程序代码之前执行守护进程启动过程中的代码,那么您可以考虑创建一个插件,只需实现 Core_IPlugin 即可。插件是在多个守护进程应用程序之间共享代码的最简单方式,它实际上可以在 3 行代码内实现。我们已经在 Core_Daemon 库中绘制了一些通用插件,但目前正在发布一个。Ini 插件为您提供了一个轻松的工具来读取和验证与应用程序一起提供的任何配置文件。

    https://github.com/shaneharter/PHP-Daemon/wiki/Creating-and-Using-Plugins

  • ###锁文件(以及锁键、锁互斥锁等) 库中包含了几种插件,实现了为您的守护进程进程创建锁的不同方式。同时运行多个守护进程实例通常是一个问题,实现锁定机制通常是一个头疼的问题。我们已经在大清早 2 点被叫醒,因为 supervisord 不能因为过期的锁文件而重新启动守护进程。我们已经捆绑了 Lock 插件,以试图让您免受同样的命运。在所有情况下,锁都是自动过期的,您可以选择使用 Memcache 键、锁文件或共享内存地址。还提供了一个模拟锁插件,以使应用程序开发更加容易。

  • ###自动重启 使用 PHP Simple Daemon 构建的应用程序将在捕获到致命错误后自动重启,并在用户定义的时间间隔内作为预防措施,以防止内存泄漏、重新初始化资源以及轮换事件日志。自动重启仅在您以“守护进程模式”运行应用程序时可用(例如,在命令提示符中使用 -d)。在您的壳中运行应用程序时,您将自行负责。

  • ### 内置事件日志 该库附带一个非常基础的日志记录功能。虽然有时会怀念现成的日志库的功能,但我们非常反感外部依赖和内存膨胀。无论如何,内置日志提供程序会将消息和标题写入您提供的日志文件。您可以在示例守护进程中的简单旋转器中看到示例。

    如果您有内部日志工具,或者只是喜欢某个日志库,您可以通过重载 log() 方法简单地替换内部工具。只需确保唯一的必需参数是要记录的消息,并且所有内部使用事件日志的东西 -- 核心守护进程、信号处理程序、工作API等 -- 都能够很好地协同工作。

    https://github.com/shaneharter/PHP-Daemon/wiki/Logging

  • ### 内置信号处理 默认情况下,您的应用程序将响应4个信号。您可以通过添加一个 ON_SIGNAL 回调来扩展或重载此行为。四个内置的行为包括:

    SIGINT kill -2(或 CTRL+C):优雅地关闭守护进程。完成事件循环的当前迭代,并通知任何工作进程完成当前任务。如果您使用工作进程,完成过程可能需要与最大工作进程超时一样长的时间,但在此之后会释放锁文件(如果正在使用),这样您可以在工作进程完成之前重新启动守护进程。

    SIGHUP kill -1使用与SIGINT相同的流程优雅地重新启动守护进程。例如,更改应用程序代码后很有用。

    SIGUSR1 kill -10将运行时统计信息块输出到事件日志或stdout(或两者都有,具体取决于您的日志配置)。包括当前运行时间、内存使用情况、事件循环繁忙/空闲统计信息以及任何已加载的工作进程或插件的统计信息。

    SIGCONT kill -18如果您的守护进程当前处于阻塞或睡眠状态,唤醒它并继续。 (始终从sleep()唤醒,可能无法总是从阻塞API调用返回。)

    https://github.com/shaneharter/PHP-Daemon/wiki/Creating-Custom-Signal-Handlers

  • ### 命令行开关 您可以在运行守护进程时运行 '-H' 帮助命令。它将显示如下帮助菜单,但可以很容易地为您自己的守护进程覆盖:

Examples\PrimeNumbers\Daemon
USAGE:
 # run.php -H | -i | [-d] [-p PID_FILE] [--recoverworkers] [--debugworkers]
 
OPTIONS:
 -H Shows this help
 -i Print any daemon install instructions to the screen
 -d Daemon, detach and run in the background
 -p PID_FILE File to write process ID out to

 --recoverworkers
   Attempt to recover pending and incomplete calls from a previous instance of the daemon. Should be run under supervision after a daemon crash. Experimental.

 --debugworkers
   Run workers under a debug console. Provides tools to debug the inter-process communication between workers.
   Console will only be displayed if Workers are used in your daemon