ryancco/

forker

通过进程分叉进行异步处理

1.0.4 2019-04-26 19:47 UTC

This package is auto-updated.

Last update: 2024-09-17 10:16:58 UTC


README

通过进程分叉在PHP中进行异步处理

示例

以下是一个荒诞的示例,创建并异步处理5个分叉的“子”进程之间的工作,总运行时间为300秒,如指定。如果一个“子”进程死亡、失败或在指定时间之前完成,将立即启动一个新的“子”进程来替代。您可以运行此示例,同时观察终端输出,并杀死和允许“子”进程完成其工作。

<?php

require_once 'vendor/autoload.php';

use ryancco\forker\JobInterface;
use ryancco\forker\WorkerDaemon;

declare(ticks=1); // PHP <= 5.6.*

class TestJob implements JobInterface
{
    /** @var array $loopsCounted */
    private $loopsCounted = array();
    
    /**
     * Entry point for each child worker
     */
    public function __invoke()
    {
        echo "New child spawned! [PID " . getmypid() . "]\n";
        $this->countTo(5);
    }
    
    public function countTo($max = 5)
    {
        for ($i = 1; $i <= $max; $i++) {
            echo $this->formatOutput($i);
            sleep(10);
        }
        
        $this->loopsCounted[$max] += 1;
    }

    private function formatOutput($loops)
    {
        return "Pass #" . $loops . " [PID " . getmypid() . "]\n";
    }
    
    private function recordLoopsCounted()
    {
        try {
            $queue = new Queue(); // Does not exist
        } catch (Exception $e) {
            exit("Unable to instantiate new Queue: " . $e->getMessage());
        }
        $queue->push($this->loopsCounted);
    }

    /**
     * Exit point for each child worker
     * Make all of your garbage collection and stats recording calls here
     */
    public function __destruct()
    {
        echo "__destruct() [PID " . getmypid() . "]\n";
        $this->recordLoopsCounted();
    }
}

$wd = new WorkerDaemon(5, 300);
$wd->executeJob(new TestJob());

许可证

此库是开源软件,采用MIT许可证授权