php多进程函数-php教程

资源魔 24 0
正在效劳器跑剧本时,防止没有了一些耗时义务,应用多过程是必不成少的。而正在 PHP5.5 之后,PHP 开端退出了多过程元素,以餍足开发需要。

保举课程:PHP教程。

php多过程普通使用正在php_cli饬令行中执行php剧本,完成多过程需求开启的扩大:pcntl、 posix(pcntl是process control过程治理的缩写)。Windows 环境下没有支持 PHP 的多过程编程,本文次要正在 Linux 环境下开发测试

pcntl_fork — 正在以后过程以后地位孕育发生分支(子过程)。
一个fork子过程的根底示例:

$pid = pcntl_fork();
//父过程以及子过程城市执行上面代码
if ($pid == -1) {
        //谬误解决:创立子过程失败时前往-1.
         die('could not fork');
} else if ($pid) {
         //父过程会失去子过程号,以是这里是父过程执行的逻辑
         pcntl_wait($status); //期待子过程中缀,避免子过程成为僵尸过程。
} else {
         //子过程失去的$pid为0, 以是这里是子过程执行的逻辑。
}

假如一个义务被合成成多个过程执行,就会缩小全体的耗时。
比方有一个比拟年夜的数据文件要解决,这个文件由不少行组成。假如单过程执行要解决的义务,量很年夜时要耗时比拟久。这时候能够思考多过程。

来看一道面试题,有一个1000万个元素的int数组,需求乞降,均匀分到4个过程解决,每一个过程解决一局部,再将后果统计进去,代码以下

  <?php

  $arrint = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];//假定不少
  $arrint = array_chunk($arrint,4,TRUE);
  for ($i = 0; $i < 4; $i++){
      	$pid = pcntl_fork();
  if ($pid == -1) {
     	die("could not fork");
  } elseif ($pid) {
      	echo $pid;
      	echo "I'm the Parent $i\n";
  } else {
       	// 子过程解决
      	// $content = file_get_contents("prefix_name0".$i);
     	$psum = array_sum($arrint[$i]);
      	echo $psum . "\n";辨别输入子过程的局部乞降数字,然而无奈进行想加,由于过程相互自力
     	exit;// 肯定要留意加入子过程,不然pcntl_fork() 会被子过程再fork,带来解决上的影响。
       	}
  }
          
  // 期待子过程执行结
  while (pcntl_waitpid(0, $status) != -1) {
      	$status = pcntl_wexitstatus($status);
      	echo "Child $status completed\n";
  }

上诉谜底中,是把数组分为4个子数组辨别用4个子过程行止理了,然而不方法把所较量争论的后果相加,由于过程都是自力实现义务的,不方法同享同一个(内存)变量,上面将引进音讯行列步队来处理过程通讯的成绩

  <?php
  $arrint = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];//假定不少
  $arrint = array_chunk($arrint,4,TRUE);//把数组分为4个

  // 创立音讯行列步队,和界说音讯类型(相似于数据库中的库)
  $id = ftok(__FILE__,'m');//天生文件key,惟一
  $msgQueue = msg_get_queue($id);
  const MSG_TYPE = 1;
  msg_send($msgQueue,MSG_TYPE,'0');//给音讯行列步队一个默许值0,必需是字符串类型
  
  //fork出四个子过程
  for ($i = 0; $i < 4; $i++){
   		$pid = pcntl_fork();
      	if ($pid == -1) {
          	die("could not fork");
      	} elseif ($pid) {
         	echo $pid;
          	echo "I'm the Parent $i\n";
      	} else {
      		// 子过程解决逻辑,互相自力,处理方法,放到内存音讯行列步队中
          	$part = array_sum($arrint[$i]);
          	implode_sum($part);//分解较量争论出的sum
          	exit;// 肯定要留意加入子过程,不然pcntl_fork() 会被子过程再fork,带来解决上的影响。
    	}
  }
          
  function implode_sum($part){
     	global $msgQueue;
      	msg_receive($msgQueue,MSG_TYPE,$msgType,1024,$sum);//猎取音讯行列步队中的值,最初一个参数为行列步队中的值
      	$sum = intval($sum) + $part;
      	msg_send($msgQueue,MSG_TYPE,$sum);//发送每一次较量争论的后果给音讯行列步队
  }
      
  // 期待子过程执行完结
  while (pcntl_waitpid(0, $status) != -1) {
      	$status = pcntl_wexitstatus($status);
      	$pid = posix_getpid();
      	echo "Child $status completed\n";
  }
      
  //一切子过程完结后,再掏出最初正在行列步队中的值,就是int数组的以及
  msg_receive($msgQueue,MSG_TYPE,$msgType,1024,$sum);
  echo $sum;//输入120

以上就是php多过程函数的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学

抱歉,评论功能暂时关闭!