PHP多进程编程

PHP本身不支持多线程,多进程支持的也不是特别好,网上找到一份多进程代码(http://jasonyu.cn/html/2010/294.html),写了一个测试程序简单测了一下,可以运行,但是离上线还差得很远。

<?php
/**
 * Project: Signfork: php多线程库
 * File: Signfork.class.php
 */

class Signfork{
    /**
     * 设置子进程通信文件所在目录
     * @var string
     */
    private $tmp_path='/tmp/';

    /**
     * Signfork引擎主启动方法
     * 1、判断$arg类型,类型为数组时将值传递给每个子进程;类型为数值型时,代表要创建的进程数.
     * @param object $obj 执行对象
     * @param string|array $arg 用于对象中的__fork方法所执行的参数
     * 如:$arg,自动分解为:$obj->__fork($arg[0])、$obj->__fork($arg[1])…
     * @return array 返回 array(子进程序列=>子进程执行结果);
     */
    public function run($obj,$arg=1){
        if(!method_exists($obj,'__fork')){
            exit('Method "__fork" not found!');
        }

        if(is_array($arg)){
            $i=0;
            foreach($arg as $key=>$val){
                $spawns[$i]=$key;
                $i++;
                $this->spawn($obj,$key,$val);
            }
            $spawns['total']=$i;
        }elseif($spawns=intval($arg)){
            for($i = 0; $i < $spawns; $i++){
                $this->spawn($obj,$i);
            }
        }else{
            exit('Bad argument!');
        }

        if($i>1000) exit('Too many spawns!');
        return $this->request($spawns);
    }

    /**
     * Signfork主进程控制方法
     * 1、$tmpfile 判断子进程文件是否存在,存在则子进程执行完毕,并读取内容
     * 2、$data收集子进程运行结果及数据,并用于最终返回
     * 3、删除子进程文件
     * 4、轮询一次0.03秒,直到所有子进程执行完毕,清理子进程资源
     * @param string|array $arg 用于对应每个子进程的ID
     * @return array 返回 array([子进程序列]=>[子进程执行结果]);
     */
    private function request($spawns){
        $data=array();
        $i=is_array($spawns)?$spawns['total']:$spawns;
        for($ids = 0; $ids<$i; $ids++){
            while(!($cid=pcntl_waitpid(-1, $status, WNOHANG)))usleep(30000);
            $tmpfile=$this->tmp_path.'sfpid_'.$cid;
            $data[$spawns['total']?$spawns[$ids]:$ids]=file_get_contents($tmpfile);
            unlink($tmpfile);
        }
        return $data;
    }

    /**
     * Signfork子进程执行方法
     * 1、pcntl_fork 生成子进程
     * 2、file_put_contents 将'$obj->__fork($val)'的执行结果存入特定序列命名的文本
     * 3、posix_kill杀死当前进程
     * @param object $obj 待执行的对象
     * @param object $i 子进程的序列ID,以便于返回对应每个子进程数据
     * @param object $param 用于输入对象$obj方法'__fork'执行参数
     */
    private function spawn($obj,$i,$param=null){
        if(pcntl_fork()===0){
            $cid=getmypid();
            file_put_contents($this->tmp_path.'sfpid_'.$cid,$obj->__fork($param));
            posix_kill($cid, SIGTERM);
            exit;
        }
    }
}
?>

测试程序如下:

<?php
require_once(dirname(__FILE__) . '/Signfork.class.php');
class ExecObj{
    public function __fork($param){
        return getmypid();
    }
    
}
echo getmypid()."\n";
$signfork = new Signfork();
$result = $signfork->run(new ExecObj(),5);
foreach ($result as $key=>$val)
{
    echo $key." ".$val."\n";
}
?>

 

转载于:https://www.cnblogs.com/end/archive/2013/03/21/2973881.html

根据原作 https://pan.quark.cn/s/0ed355622f0f 的源码改编 野火IM解决方案 野火IM是专业级即时通讯和实时音视频整体解决方案,由北京野火无限网络科技有限公司维护和支持。 主要特性有:私有部署安全可靠,性能强大,功能齐全,全平台支持,开源率高,部署运维简单,二次开发友好,方便与第三方系统对接或者嵌入现有系统中。 详细情况请参考在线文档。 主要包括一下项目: 野火IM Vue Electron Demo,演示如何将野火IM的能力集成到Vue Electron项目。 前置说明 本项目所使用的是需要付费的,价格请参考费用详情 支持试用,具体请看试用说明 本项目默认只能连接到官方服务,购买或申请试用之后,替换,即可连到自行部署的服务 分支说明 :基于开发,是未来的开发重心 :基于开发,进入维护模式,不再开发新功能,鉴于已经终止支持且不再维护,建议客户升级到版本 环境依赖 mac系统 最新版本的Xcode nodejs v18.19.0 npm v10.2.3 python 2.7.x git npm install -g node-gyp@8.3.0 windows系统 nodejs v18.19.0 python 2.7.x git npm 6.14.15 npm install --global --vs2019 --production windows-build-tools 本步安装windows开发环境的安装内容较多,如果网络情况不好可能需要等较长时间,选择早上网络较好时安装是个好的选择 或参考手动安装 windows-build-tools进行安装 npm install -g node-gyp@8.3.0 linux系统 nodej...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值