首页 > php教程 > php手册 > 正文

php父子进程通信

php中文网
发布: 2016-06-06 20:12:06
原创
1937人浏览过

多进程demo里介绍过,如何fork子进程。 但是,谁家的孩子谁管,你fork了得记得处理啊,不然哪天捣点乱啥的,是吧。 进程与进程之间通信的方式有很多种,这里用最简单的信号通信。当我们kill -9 一个进程的时候,实际上就是向该进程发送一个终止信号,之前已

多进程demo里介绍过,如何fork子进程。
但是,谁家的孩子谁管,你fork了得记得处理啊,不然哪天捣点乱啥的,是吧。

进程与进程之间通信的方式有很多种,这里用最简单的信号通信。当我们kill -9 一个进程的时候,实际上就是向该进程发送一个终止信号,之前已经绑定了信号处理器,所以,我们可以用其他进程通知另一个进程做出相应的反应(kill -9 的时候是退出)。父子进程通信也不例外,父进程绑定信号处理器,用来协调子进程,子进程向父进程发送信号,让父进程有相应的反应。

绑定信号处理器:pcntl_signal http://cn2.php.net/manual/en/function.pcntl-signal.php#70161
发送信号:posix_kill http://cn2.php.net/manual/en/function.posix-kill.php
需要注意一点,信号的不可重入性,当一个子进程的信号处理器正处理时,将忽略其他的信号处理。所以,需要pcntl_watipid
http://cn2.php.net/manual/en/function.pcntl-waitpid.php 来等待。

运用上边的理论,实现了一个固定子进程处理任务的程序:
父进程fork子进程,然后绑定SIGCHLD信号,子进程结束触发父进程的SIGCHLD信号处理器,末尾主循环,统计子进程的个数,当低于指定值时,fork新的子进程:代码如下:

<?php                                                                                                                         

declare(ticks=1);
$child_nums = 0;
function catch_signal($signal){
    global $child_nums;
    while( pcntl_waitpid(-1, $status, WNOHANG) > 0 ) { 
        if($signal == SIGCHLD){
            $child_nums--;  
        }   
    }   
}

function fork_do($c){
    global $child_nums;
    while($c--) {
        if(pcntl_fork() == 0 ) { 
            real_do();              
        } else {
            $child_nums++;  
        }   
    }   
}

function real_do(){
    sleep(rand(1,3));
    exit();
}

$manage_pid = getmypid();
$fork_nums = 4;
pcntl_signal(SIGCHLD,'catch_signal');

fork_do($fork_nums);

while($child_nums != 0){ 
    echo "Childs " . $child_nums . "\n";    
    if($child_nums < $fork_nums) {
        fork_do($fork_nums - $child_nums);  
    }   
}         
登录后复制

注:要看动态效果显得很酷的话,把sleep改成usleep或者干脆去掉吧。

商城购物系统
商城购物系统

商城购物系统是一个以php+MySQL进行开发的可塑性极强的电子商品平台;商城购物系统可自定义商品栏目内容,包含分销功能,分销管理、分销订单提成完整功能,商品加购物车、商品支付、商品发货等一系列流程,包括pc端和手机H5端。

商城购物系统 0
查看详情 商城购物系统
相关标签:
php
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号