firehed/processmanager

用于守护进程工作者的简单基础

dev-master 2019-02-26 20:25 UTC

This package is auto-updated.

Last update: 2024-08-27 08:21:57 UTC


README

要求

  • posixpcntl 扩展
  • PHP5.4+ (使用现代语法)
  • 对命令行PHP的基本了解

守护进程

一个非常实用的工具,但名字非常无聊。用两行代码守护你的PHP脚本。

使用方法

代码

<?php
// Preferred:
require 'vendor/autoload.php'; // composer
declare(ticks=1);
(new Firehed\ProcessControl\Daemon)
    ->setUser('sites')
    ->setPidFileLocation('/var/run/gearman-manager2.pid')
    ->setStdoutFileLocation(sys_get_temp_dir().'/my.log')
    ->setStdErrFileLocation('/dev/null')
    ->setProcessName(basename(__FILE__).' master process')
    ->autoRun();
// The rest of your original script

CLI

php yourscript.php {status|start|stop|restart|reload|kill}

是的,就这么简单。

操作

  • 状态:检查进程状态。返回
    • 0 如果正在运行
    • 1 如果已经死亡但pid文件仍在
    • 3 如果已停止
  • 启动:启动守护进程
  • 停止:通过SIGTERM优雅地停止守护进程
  • 重启:如果正在运行则停止并启动
  • 重新加载:向守护进程发送SIGUSR1(你需要实现一个重新加载功能,见下文)
  • 杀死:通过SIGKILL(kill -9)杀死守护进程

选项

  • setProcessName($string):设置进程名称,它将出现在如top等实用程序中。此功能仅在PHP5.5+下受支持。
  • setPidFileLocation($path):指定pid文件的位置。此文件在守护进程运行时存储进程ID,在守护进程停止时消失。
  • setStdoutFileLocation($path):任何本应写入STDOUTechoprint等)的内容将被重定向到的文件。
  • setStdErrFileLocation($path):任何本应写入STDERR的内容将被写入的文件。似乎在守护进程化后,display_errors不再写入STDERR,因此将其设置为/dev/null相对安全。
  • setUser($system_user):如果你想以低安全级别的用户运行进程,请在此处指定用户名。如果你在具有chkconfig/etc/init.d的系统上启动守护进程,这尤其有用,因为那些以root身份运行。

稍后提供(?)

  • 详细输出
  • 同步模式(调试时不守护进程化)
  • 日志文件配置

有用提示

  • STDOUT(echo、print)被重定向到日志文件。
  • "重新加载"命令没有安装SIGUSR1的处理程序将不会执行任何操作。示例即将提供。

已知问题

  • 尽管为它打开了一个日志文件,但似乎STDERR并没有去任何地方。
  • 脚本无法自动设置"重新加载"绑定。这是一个PHP限制:"declare构造也可以在全局范围内使用,影响其后的所有代码(然而,如果包含declare的文件,则不会影响父文件)"。 http://docs.php.net/manual/en/control-structures.declare.php