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程序设计有所帮助。