icy8/process

1.0.3 2022-12-05 06:20 UTC

This package is auto-updated.

Last update: 2024-10-17 12:52:30 UTC


README

介绍

php多进程和守护进程的执行器,只支持在命令行运行。 由于项目使用了pcntl_async_signals函数做信号分发,所以要求你的php版本>=7.1。

进程控制流程

 send SIGUSR1 ->    /process1    \
  ^                / process2     \
master  ------------ process3      SIGUSR1 exit(1)
  ^                \ process4     /
  |                 \process5    /
  |send SIGTERM
  |
 kill

软件架构

  1. php >= 7.1

  2. pcntl扩展

  3. posix扩展

安装教程

composer require icy8/process

使用说明

  1. 多进程模型

    如果master进程被kill,子进程也会被强制退出。

    <?php
    use icy8\process\Worker;
    $handle        = new Worker();
    $handle->total = 2;// 需要运行的进程数
    // $handle->max = 10;// 允许同一时间打开的进程数上限 0为无上限;通常建议设定一个大于零的数值
    $handle->run(function ($worker) {
        // 闭包里是你的业务代码    
        while (1) {
            var_dump(time());
            sleep(1);
        }
    });

    自由分配每个进程的工作逻辑:

    <?php 
    use icy8\process\Worker;
    $handle        = new Worker();
    $processes     = [
        function () {
            while (1) {
                var_dump('process 1');
                sleep(1);
            }
        },
        function () {
            while (1) {
                var_dump('process 2');
                sleep(1);
            }
        },
        function () {
            while (1) {
                var_dump('process 3');
                sleep(1);
            }
        },
        function () {
            while (1) {
                var_dump('process 4');
                sleep(1);
            }
        },
    ];
    // 此时你不再需要手动配置$handle->total属性
    $handle->run($processes);
  2. 守护进程模型

    守护进程在制作过程中已经将标准输出重定向到/dev/null

    执行:php daemon.php --start|stop|status

    <?php
    use icy8\process\Daemon;
    $daemo = new Daemon();
    $daemon->run(function () {    
        sleep(10);        
    });

    如果你想要更自由一些:

    <?php
    use icy8\process\Daemon;
    $daemon = new Daemon();
    $daemon->start();
    // 所有业务逻辑写在下面
    // 此时的脚本文件不再自动支持 --start|stop|status参数
    $i = 0;
    while($i < 10) {
        $i++;
        var_dump($i);
    }
  3. 多进程结合守护进程使用

    这种模式下,通常多进程模型中的master进程就是当前的守护进程。

    <?php
    use icy8\process\Worker;
    use icy8\process\Daemon;
    
    $daemon = new Daemon();
    //$daemon->pidFile = '/www/test.pid';// 允许自定义一个存放进程id的文件路径,一定要设置绝对路径
    $daemon->run(function () {
        // 放到守护进程运行
        $handle        = new Worker();
        $handle->total = 2;
        $handle->run(function ($worker) {
            while (1) {
                var_dump(time());
                sleep(1);
            }
        });
    });