shaneharter/php-daemon

该软件包已废弃,不再维护。未建议替代软件包。

创建稳定、长期运行的PHP守护进程

v2.0 2013-06-26 18:01 UTC

This package is not auto-updated.

Last update: 2022-01-14 14:35:19 UTC


README

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

注意:由于许多原因,PHP 不是创建服务器或守护进程的最佳语言选择。我创建了此库,如果您 必须 使用 PHP 来完成这些事情,您可以轻松地做到这一点并产生很好的结果。但如果有选择,Java、Python、Ruby 等语言更适合此用途。

注意:在过去的几年里,我没有时间投资于这个项目。这不是现代 PHP,但它可能仍然适用于您。如果有人愿意维护一个分支,请让我知道,我会在这里指出。

要求

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

守护进程监控

  • 在过去几年中,我已经构建和部署了基于这个库的许多守护进程以及各种类型的 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 调试外壳,具有新的、强大的命令以及将自定义断点集成到您的 own worker 代码中的简化。
    • 将散布在 Core_DaemonCore_Worker_Mediator 类中的所有进程克隆、恢复和管理代码集中到简单的 ProcessManager 插件中。
    • 核心守护进程和中介类中的几十个其他错误修复和改进,以实现更简单、更清晰的代码。

支持和咨询

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

##显著功能

  • ###我们提供事件循环:无需样板代码即可构建您的应用程序。您可以直接从盒中开始一个工作应用程序。一旦扩展 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版本的Node.js)

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

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

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

    由于您无法在这种应用程序下运行xdebug或zend debugger,因此提供了一个调试控制台,允许您在代码中设置伪断点。您的守护进程变成了一个交互式shell,让您能够继续或中止操作,以及一打以上的命令来了解在任何给定时间发生的事情。导出函数参数、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无法重启守护进程,因为有一个过期的锁文件。我们打包了锁插件来试图让您避免同样的命运。在所有情况下,锁都是自动过期的,您可以选择使用Memcache键、锁文件或共享内存地址。还提供了一个模拟锁插件,以使应用程序开发更容易。

  • ### 自动重启使用PHP Simple Daemon构建的应用程序在捕获到致命错误后,将自动重启,并且可以作为一个预防措施,在用户定义的时间间隔内重启,以对抗内存泄漏、重新初始化资源以及旋转事件日志。自动重启仅在您以“守护进程模式”运行应用程序时可用(例如,在命令提示符中使用-d)。如果您在shell中运行应用程序,那就得您自己处理了。

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

    如果您有一个内部日志工具,或者只是一个喜欢的日志库,您可以通过覆盖log()方法来简单地替换内部工具。只需确保唯一的必需参数是要记录的消息,以及内部使用事件日志的任何东西——Core_Daemon、信号处理程序、工作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