zazoomauro/php-daemon

创建稳固、长时间运行的PHP守护进程

v2.0 2015-09-29 12:15 UTC

This package is not auto-updated.

Last update: 2024-09-18 16:35:56 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 的开发计划

守护进程监控

  • 在过去的几年里,我基于这个库构建和部署了许多守护进程,以及各种类型的 cron 作业。最近,我推出了 https://cronitor.io —— 一个简单的 cron(和守护进程!)监控服务。通过一行代码,您可以将 Cronitor 集成到您的守护进程中,并在出现问题时收到电子邮件/短信警报。

[新增] 版本 2.1 已发布!

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

支持 & 咨询

  • 提供商业支持和咨询,包括旧金山湾区现场支持。
  • 通过 GitHub 联系我获取更多详细信息,包括免费咨询。

##显著特性

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

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

    您可以使用一行代码实现时钟,或将其省略以使用基于异步或阻塞 IO 的事件循环。

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

    作为持久、长时间运行的后台工作进程的替代方案,Tasks API为您提供了简单的方法来调用任意后台进程中的方法,该方法在您的操作完成时会退出。

    PHP Simple Daemon工作进程和任务是在具有非常少此类工具的语言中简单而强大的多进程工具。(但不要尝试构建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目录中还包括了一个有用的信号控制台应用:连接到您的守护进程,并轻松发送和重发信号。查看PrimeNumbers应用以了解使用信号处理程序模拟偶尔的真实世界事件的示例。

    您还会找到一个shm_console应用,它允许您连接到一个共享内存地址,扫描键,查看它们,甚至运行一个打印出创建、更新和删除事务日志的watch命令。

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

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

  • ### 简单回调:因为解耦更好。一个类似jQuery的简单API允许您将回调添加到守护进程的生命周期事件(例如:启动、卸载、fork等)中,并创建自己的。使用on()附加事件监听器,使用off()移除它,并使用dispatch()创建自己的。与所有PHP Simple Daemon API一样,它接受一个Closure或任何有效的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)。当你在shell内运行应用程序时,则需自行处理。

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

    如果您有一个内部日志工具,或者只是喜欢某个日志库,您可以简单地通过覆盖log()方法来替换内部工具。只需确保唯一的必需参数是要记录的消息,并且所有内部使用事件日志的组件(如Core_Daemon、信号处理器、Workers 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 | -I TEMPLATE_NAME [--install] | [-d] [-p PID_FILE] [--recoverworkers] [--debugworkers]
 
OPTIONS:
 -H Shows this help
 -i Print any daemon install instructions to the screen
 -I Create init/config script
    You must pass in a name of a template from the /Templates directory
    OPTIONS:
     --install
       Install the script to /etc/init.d. Otherwise just output the script to stdout.

 -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