php-pmd/daemon

PHP CLI 守护进程(clio/clio)

0.0.2 2021-04-27 09:57 UTC

This package is auto-updated.

Last update: 2024-09-28 14:17:23 UTC


README

基于 Clio 的守护进程。

守护进程类提供了启动和终止守护进程的辅助函数。

安装

composer require php-pmd/daemon

需要 PHP 5.4。这个库是在 POSIX 系统上开发的,旨在在加载了 posix、pcntl 和 sockets 扩展的 POSIX 系统上使用。

Daemon::isRunning($pid)

检查守护进程当前是否正在运行。返回 true 或 false

<?php
use PhpPmd\Daemon;
if (Daemon::isRunning('/path/to/process.pid')) {
    echo "daemon is running.\n";
} else {
    echo "daemon is not running.\n";
}

Daemon::work(array $options, callable $callable)

$callable 可调用对象守护进程化。$options 键值数组必须包含 pid 作为 PID 文件的路径

<?php
use PhpPmd\Daemon;
if (Daemon::isRunning('/path/to/process.pid')) {
    echo "daemon is already running.\n";
} else {
    Daemon::work(array(
            'pid'    => '/path/to/process.pid', // required
            'stdin'  => '/dev/null',            // defaults to /dev/null
            'stdout' => '/path/to/stdout.txt',  // defaults to /dev/null
            'stderr' => '/path/to/stderr.txt',  // defaults to php://stdout
        ),
        function($stdin, $stdout, $stderr) { // these parameters are optional
            while (true) {
                // do whatever it is daemons do
                sleep(1); // sleep is good for you
            }
        }
    );
    echo "daemon is now running.\n";
}

PID 文件是一个普通的文本文件,其唯一内容是进程 ID。如果它不存在,库将自动创建它。强烈建议在代码中添加对 sleep 的调用以减轻系统负载。

Daemon::kill($pid, $force = false, $delete = false)

$force

如果 force 的值为 true,则 sig 为 SIGKILL

如果 force 的值为 false,则 sig 为 SIGTERM

$delete

在终止后删除 PID 文件的标志

终止守护进程

<?php
use PhpPmd\Daemon;

if (Daemon::isRunning('/path/to/process.pid')) {
    echo "killing running daemon ...\n";
    if (Daemon::kill('/path/to/process.pid')) {
        echo "daemon killed.\n";
    } else {
        echo "failed killing daemon.\n";
    }
} else {
    echo "nothing to kill.\n";
}

如果第二个参数设置为 true,则此函数将向进程发送 SIGKILL。如果设置为 false,则此函数将向进程发送 SIGTERM

如果第三个参数设置为 true,则此函数将在成功发送终止信号后尝试删除 PID 文件。

致谢

文本颜色和样式指定符完全取自 Stefan Walk 的 PEAR 的 Console_Color 类。守护进程类受到了 Andy Thompson 在 在 POSIX 系统上守护进程化 PHP CLI 脚本 的博客文章的极大启发。

许可证

Clio 在 MIT 许可证 下发布。