> 백엔드 개발 > PHP 문제 > PHP에서 다중 프로세스를 구현하는 방법

PHP에서 다중 프로세스를 구현하는 방법

王林
풀어 주다: 2023-03-05 09:12:01
원래의
3540명이 탐색했습니다.

PHP에서 다중 프로세스를 구현하는 방법: pcntl 및 posix 확장을 통해. 필요에 따라 pcntl_fork() 함수를 사용하여 하위 프로세스를 생성하고 pcntl_wait() 함수를 사용하여 현재 프로세스를 차단할 수 있습니다.

PHP에서 다중 프로세스를 구현하는 방법

php 다중 프로세스에는 pcntl, posix 확장 지원이 필요합니다.

다중 프로세스 구현은 cli 모드에서만 가능합니다. 웹 서버 환경에서는 예상치 못한 결과가 발생할 수 있습니다.

(추천 동영상 튜토리얼: php 동영상 튜토리얼)

멀티 프로세스 핵심 기능:

pcntl_fork(하위 프로세스 생성), pcntl_wait(현재 프로세스 차단)

자세한 소개:

pcntl_fork:
로그인 후 복사

두 번 반환 call 은 상위 프로세스의 하위 프로세스 pid를 반환하고 하위 프로세스에서는 0을 반환하며 오류 시 -1을 반환합니다.

pcntl_wait ( int &$status [, int $options ] ):
로그인 후 복사

하위 프로세스가 종료되거나 현재 프로세스를 종료하라는 신호를 받을 때까지 현재 프로세스를 차단합니다. 이는 현재 프로세스를 종료하라는 신호이며 하위 프로세스가 종료하기 위해 전송한 SIGCHLD는 계산되지 않습니다. $status를 사용하여 자식 프로세스의 상태 코드를 반환하고, 두 번째 매개 변수를 지정하여 차단 상태에서 호출되는지 여부를 나타낼 수 있습니다. 함수 반환 값은 자식 프로세스가 없는 경우입니다. 반환 값은 -1입니다.

비차단 방식으로 호출되면 이 함수는 하위 프로세스가 실행 중이지만 종료되지 않은 경우에도 0을 반환할 수 있습니다.

pcntl_waitpid ( int $pid , int &$status [, int $options ] )
로그인 후 복사

함수는 pcntl_wait와 동일하지만 차이점은 waitpid가 지정된 pid를 기다리는 하위 프로세스라는 것입니다. pid가 -1이면 pcntl_waitpid는 pcntl_wait와 동일합니다. 하위 프로세스의 상태 정보는 pcntl_wait 및 pcntl_waitpid 함수의 $status에 저장됩니다.

(관련 튜토리얼 추천:

php 그래픽 튜토리얼

)예:

php에서는 항상 고정된 수의 하위 프로세스가 실행됩니다.

필요에 따라 pcntl_fork(하위 프로세스 생성), pcntl_wait(현재 프로세스 차단) 및 기타 핵심 기능을 사용하세요

코드 구현:

<?php

//最大的子进程数量
$maxChildPro = 8;

//当前的子进程数量
$curChildPro = 0;

//当子进程退出时,会触发该函数,当前子进程数-1
function sig_handler($sig)
{
    global $curChildPro;
    switch ($sig) {
        case SIGCHLD:
            echo &#39;SIGCHLD&#39;, PHP_EOL;
            $curChildPro--;
            break;
    }
}

//配合pcntl_signal使用,简单的说,是为了让系统产生时间云,让信号捕捉函数能够捕捉到信号量
declare(ticks = 1);

//注册子进程退出时调用的函数。SIGCHLD:在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。
pcntl_signal(SIGCHLD, "sig_handler");

while (true) {
    $curChildPro++;
    $pid = pcntl_fork();
    if ($pid) {
//父进程运行代码,达到上限时父进程阻塞等待任一子进程退出后while循环继续
        if ($curChildPro >= $maxChildPro) {
            pcntl_wait($status);
        }
    } else {
//子进程运行代码
        $s = rand(2, 6);
        sleep($s);
        echo "child sleep $s second quit", PHP_EOL;
        exit;
    }
}
로그인 후 복사

위 내용은 PHP에서 다중 프로세스를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿