php进程间通讯实例分析
本文实例讲述了php进程间通讯的方法。分享给大家供大家参考,具体如下:
php单进程单线程处理批量任务太慢了,受不鸟了,但是php不能多线程,最终选择了多进程处理批量任务.
php多进程主要使用for进行分裂,然后利用的unix/linux的信号量进行进程间通讯.
本例使用的是:生产者=>消费者=>收集器,的模式.
<?php
//=====全局变量=====
//ipc进程间通讯
$key=ftok(__FILE__,"a");
$queue=msg_get_queue($key);
//进程ID
$producer_pid=0;
$consumers_pid=array();
$collector_pid=posix_getpid();
//=====消费者=====
for($i=0;$i<2;$i++){
$consumer_pid=pcntl_fork();
if($consumer_pid==-1){
exit("couldnotfork!\n");
}elseif($consumer_pid){
//pcntl_wait($status);
echo"consumer_pid:$consumer_pid\n";
$consumers_pid[]=$consumer_pid;
}else{
$pid=posix_getpid();
echo"consumer_pid:$pidstart\n";
while(true){
msg_receive($queue,$pid,$msgtype,1024,$message);
if($message=="exit"){
break;
}
//数据处理
$n=intval($message);
msg_send($queue,$collector_pid,$n*$n);
}
exit("consumerok!\n");
}
}
//=====产生者=====
$producer_pid=pcntl_fork();
if($producer_pid==-1){
exit("couldnotfork!\n");
}elseif($producer_pid){
//pcntl_wait($status);
echo"producer_pid:$producer_pid\n";
}else{
$pid=posix_getpid();
echo"producer_pid:$pidstart\n";
$n=0;
for($i=0;$i<10;$i++){
foreach($consumers_pidas$consumer_pid){
$n++;
msg_send($queue,$consumer_pid,$n);
}
sleep(1);
}
foreach($consumers_pidas$consumer_pid){
msg_send($queue,$consumer_pid,"exit");
}
sleep(1);
msg_send($queue,$collector_pid,"exit");
exit("producerok!\n");
}
//=====收集器=====
while(true){
msg_receive($queue,$collector_pid,$msgtype,1024,$message);
if($message=="exit"){
break;
}
echosprintf("%5d:%d\n",$msgtype,$message);
}
exit("collectorok!\n");
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP进程与线程操作技巧总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。