php 多进程处理

<?php
/**
* @copyright nidongde
* @author fanyijie
**/

class ProcessPool
{
    private $workProcess;
    private $globalProcessSize;
    private $currentSize;

    public function __construct($size = 5)
    {
        declare(ticks = 1);
        $this->workProcess = array();
        $this->globalProcessSize = $size;
        $this->currentSize = 0;

        pcntl_signal(SIGCHLD,array(&$this,"childFinished"));
    }

    private function childFinished(){
        while($pid = pcntl_waitpid(-1, $status, WNOHANG) > 0 ){
            echo 'child finished '.$pid."\n";
            unset($this->workProcess[$pid]);
            $this->currentSize--;
        }
    }

    public function addMission($object, $method, $params)
    {
	//若存在db等资源共享情况,建议重新生成object
        $class = get_class($object);
        $reflectClass = new ReflectionClass($class);
        $methods = $reflectClass->getMethods();
        $methodFunction = null;
        foreach($methods as $reflectMethod){
            if($reflectMethod->getName() == $method){
                $methodFunction = $reflectMethod;
                break;
            }
        }
        if (!empty($methodFunction)) {
            while ($this->currentSize >= $this->globalProcessSize) {
                sleep(1);
            }

            $pid = pcntl_fork();
            if ($pid == 0) {
                $ret = $methodFunction->invoke($object, $params);
                //子进程结束
                echo $ret." pid :".getmypid();
                exit(0);
            } else {
                $this->currentSize++;
                $this->workProcess[] = $pid;
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值