>  기사  >  백엔드 개발  >  PHP 다중 프로세스 기능이란 무엇입니까?

PHP 다중 프로세스 기능이란 무엇입니까?

(*-*)浩
(*-*)浩원래의
2019-05-13 16:59:143318검색

서버에서 스크립트를 실행할 때 시간이 많이 걸리는 일부 작업은 피할 수 없으며 여러 프로세스의 사용이 필수적입니다. PHP5.5 이후 PHP는 개발 요구 사항을 충족하기 위해 다중 프로세스 요소를 추가하기 시작했습니다.

추천 과정: PHP 튜토리얼.
PHP 다중 프로세스 기능이란 무엇입니까?

php 다중 프로세스는 일반적으로 php_cli 명령줄에서 PHP 스크립트를 실행하여 여러 프로세스에 대해 활성화해야 하는 확장 기능을 구현하는 데 사용됩니다: pcntl, posix(pcntl은 프로세스 제어 프로세스 관리의 약어입니다). PHP의 다중 프로세스 프로그래밍은 Windows 환경에서 지원되지 않습니다. 이 기사는 주로 Linux 환경에서 개발 및 테스트되었습니다.

pcntl_fork - 현재 프로세스의 현재 위치에 분기(자식 프로세스)를 생성합니다.
포크 하위 프로세스의 기본 예:

$pid = pcntl_fork();
//父进程和子进程都会执行下面代码
if ($pid == -1) {
        //错误处理:创建子进程失败时返回-1.
         die('could not fork');
} else if ($pid) {
         //父进程会得到子进程号,所以这里是父进程执行的逻辑
         pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
} else {
         //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
}

작업을 여러 프로세스로 나누어 실행하면 전체 시간 소모가 줄어듭니다.
예를 들어, 처리해야 할 비교적 큰 데이터 파일이 있습니다. 이 파일은 여러 줄로 구성됩니다. 단일 프로세스가 처리할 작업을 실행하는 경우, 볼륨이 크면 시간이 오래 걸립니다. 이때 여러 프로세스를 고려할 수 있습니다.

합산이 필요한 1,000만 개의 요소가 포함된 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.