旗下导航:搜·么
当前位置:网站首页 > PHP教程 > 正文

php多历程函数【php教程】,php

作者:搜教程发布时间:2019-11-26分类:PHP教程浏览:60评论:0


导读:在服务器跑剧本时,避免不了一些耗时使命,运用多历程是必不可少的。而在PHP5.5以后,PHP最先加入了多历程元素,以满足开辟需求。引荐课程:PHP教程。php多历...
在服务器跑剧本时,避免不了一些耗时使命,运用多历程是必不可少的。而在 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多历程函数的细致内容,更多请关注ki4网别的相干文章!

标签:php


欢迎 发表评论: