如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
php多进程同步最近工作中发现PHP下的多进程会有很多问题,多个进程访问同一资源可能产生不同步问题,由于没有同步造成很多数据混乱和错误。如果多个进程跑在同一台主机上的时候,可以通过临界区的办法来解决这个问题。临界区是一段受保护的代码段,所有进程中只有一个可以执行其中的代码,而其它进程要阻塞在临界区外面等待进入,相当于排队买东西,避免大家进来哄抢。实现临界区有很多种方法,其中一种是利用信号量,PHP本身也自带与信号量有关的操作,通过以下代码实现://生成几个子进程抢资源,用semapher做保护$process_num=3;print"老爸:我是老爸,我要生{$process_num}个小孩。\n";$children=array();$source_id=ftok('test.php','w');$sem=sem_get($source_id,1);//取得一个semaphore,可以申请的只有一个/*以下要来生小孩*/$i=1;while($i<=$process_num){$pid=pcntl_fork();//生出一个子程序if($pid==-1){//要是$pid是-1那就是出错了exit(1);//离开,并且报告出错}elseif($pid!=0){//若$pid不是0的话,那就是父进程/*这是老爸专区*/print"老爸:生了一个第{$i}個孩子,pid是{$pid}\n";$children[]=$pid;}else{//子程序拿到的$pid是0/*这是孩子专区*/break;//直接跳出}$i++;}if($pid){/*老爸会进到这里*/$status=null;print"老爸:老爸会等大家玩好才离开\n";foreach($childrenas$pid){//要等每個孩子都离开才离开pcntl_waitpid($pid,$status);print"老爸:pid是{$pid}的那个孩子,回去时他告诉我他的状況是{$status}\n";}print'老爸也要走了'."\n";}else{/*以下是小朋友游乐区*/for($j=1;$j<3;$j++){sem_acquire($sem);//向编号为$sem信号量申请进入临界区/*临界区开始*/print"我是第{$i}个小朋友,我是第{$j}次进入了临界区,我要玩{$j}秒\n";sleep($i);print"我是第{$i}个小朋友,要离开临界区了\n";/*临界区结束*/sem_release($sem);//释放编号为$sem的信号量}print"我是第{$i}个小朋友,要走了\n";}输出结果:信号量原是用在铁路上的管理机制,我们今天看到的铁路大多是双线并行,但有的路段受山势、地形影响只有单条铁轨,必须保证同一时间只能有一列火车运行通过这些路段。早先铁路上就是用信号灯来管理的:没有火车经过时,信号等处于闲置状态,一旦有火车进入此路段,信号灯即变为在用状态,其他的火车经过时就需要等待,等待先前的火车驶出路段信号等变为闲置后,才能进入此路段,一旦又有火车进入,信号灯又变为繁忙……,以此来保障铁路运行的安全畅通。如果多个进程跑在多台主机上的时候,可以通过模仿临界区的处理机制,利用memcache等工具自行实现锁和临界区来解决这个问题。PostedinHYPERLINK"http://duwenqi.com/?cat=1"\o"查看未分类中的全部文章"未分类|HYPERLINK"http://duwenqi.com/?p=152"\l"respond"\o"《PHP多进程同步》上的评论"NoComments»用PHP实现多进程(多任务)*基于PHP5实现*借助proc_open*能启动多进程,你可以使用你的想象力做你想做的了*如果你是在linux上跑php,并且启用pcntl模块后,使用pcntl函数该更好PHP代码<?phperror_reporting(E_ALL);set_time_limit(0);classThread{protected$_pref;//processreferenceprotectedstatic$_instance=null;protected$_pipes;privatefunction__construct(){$this->_pref=0;}publicstaticfunctiongetInstance($file){if(null==self::$_instance){self::$_instance=newself;}$descriptor=array(0=>array("pipe","r"