개발 꿀팁/PHP

PHP 멀티프로세스 초탐

Jammie 2022. 9. 29. 14:41
반응형

우리 모두는 PHP가 단일 프로세스에서 실행된다는 것을 알고 있으며, PHP 처리의 다중 동시성은 주로 서버 또는 PHP-FPM의 다중 프로세스와 그 프로세스의 다중화에 의존하지만, PHP의 다중 프로세스 구현은 특히 백그라운드 CLI 모드에서 대량의 데이터를 처리하거나 백그라운드 데모 데몬 데몬을 실행할 때 다중 프로세스의 이점은 말할 필요도 없습니다.

PHP의 다중 스레드도 언급되었지만 프로세스 내 다중 스레드 자원 공유 및 할당 문제는 해결하기 어렵습니다.PHP는 또한 다중 스레드를 끄고 싶은 확장 pthreads가 있지만 안정적이지 않고 환경이 스레드 안전이며 많이 사용되지 않는다고 합니다.

이전에 PHP 그룹의 한 대신은 백그라운드 PHP가 업그레이드하려면 다중 프로세스를 피할 수 없다고 지도했습니다. 마침 회사의 수호 프로세스도 PHP의 다중 프로세스를 적용했습니다. 구 형의 각종 자료와 매뉴얼을 결합하여 마침내 다중 프로세스를 이해하고 스스로 작은 demo(리눅스 시스템에서 구현)를 작성했습니다. 이 문장을 사용하여 요약하면 다음과 같습니다.착오가 있었습니다, 제시해 주셔서 감사합니다.

PHP의 다중 프로세스를 구현하려면 두 개의 확장 pcntl과 posix가 필요하며 설치 방법은 여기에서 다시 설명하지 않습니다

하위 프로세스를 만들기로 했다.
PHP는 더 많이 생성 프로세스의 하위 프로세스를 시작해 함수가 필요하다.;pcntl_fork ( )

함수. 상해. fork
현재 위치는 현재 프로세스 pcntl_fork ( ) —에 분파.(아들)프로세스하나의 함수를 만들었다.이후 새로운 자식 자식이다.아버지의 계승과 발전 과정을 현재 프로세스 컨텍스트에서 아버지처럼 아래로 떨어진 거리에서 함수 수행 pcntl_fork ( )에 도착한 것일 뿐의 귀환을 가져오기와 달리 값 pcntl_fork ( ) 우리를 판단할 수 있을 것은 구분해 분배하는 부모 부모 프로세스가 마사코를 하다 다른 마사코 논리 처리하다.

성공적으로 수행할 때 함수 pcntl_fork ( )은 프로세스의 부모 프로세스로 돌아가 아들 때문에. id ( pid )시스템의 프로세스를 초기 ini프로세스의 pid를 1t, 후에 발생할 프로세스의 pid기 때문에 우리는 이 프로세스보다 클 수 있는 판단을 통해 1보다 큰 결과를 pcntl_fork ( ) 현재 프로세스 프로세스는 확실하다. 아버지,

반면에 하위 프로세스를 함수의 수치는 이는 고정 값으로 돌아가 우리도 0을 통해 판단할 수 있다. pcntl_fork ( )0의 결과를 오고 있다. 확실히 고정자프로세스다.;

함수가 실패하고 집행할 때 pcntl_fork ( )은 물론 부모도 없을 것으로 아들 - 1 적이 있다. 프로세스생。

눈여겨볼 만하다. 프로세스 fork
다음은 하나의 프로세스의 아들 fork 간단한 예:.

   $ppid = posix_getpid();
    $pid = pcntl_fork();
    if ($pid == -1) {
        throw new Exception('fork 하위 프로세스 실패!');
    } elseif ($pid > 0) {
        cli_set_process_title("나는 부모 프로세스이고, 나의 프로세스 id는 {$ppid}이다.");
     sleep(30); // 30초간 유지해서 ps에 걸릴 수 있도록 하세요.
    } else {
        $cpid = posix_getpid();
        cli_set_process_title("나는 {$ppid}의 하위 프로세스이고, 나의 프로세스 id는 {$cpid}이다.");
        sleep(30);
    }

이때 두 가지 함수를 소개하겠습니다.

posix_getpid(): 현재 프로세스의 pid를 가져옵니다.

cli_set_process_title( '명랑한 이름'): 현재 프로세스에 대한 소리 만들기밝은 이름.

이 예를 실행하면, 우리는 볼 수 있다.현재까지 두 개의 PHP 프로세스가 진행되었습니다

하위 프로세스 관리
프로세스를 생성했습니다, 그러면 하위 프로세스를 어떻게 관리합니까?신호를 사용하다

컴퓨터 과학에서 신호는 유닉스, 유닉스 유사 및 기타 POSIX 호환 운영 체제에서 프로세스 간 통신을 제한하는 방법입니다.그것은 프로세스가 이벤트가 발생했음을 알리는 비동기식 알림 메커니즘입니다

분배 신호 처리 장치
우리는 재친 프로세스를 통해하위 프로세스에서 전송된 신호를 수신하고 하위 프로세스의 상태를 판단하여 하위 프로세스를 관리합니다.

우리는 부모 프로세스가 필요하다.pcntl_signal() 함수와 pcntl_signal_dispa 사용tch() 함수는 각 하위 프로세스에 신호 프로세서를 설치합니다

pcntl_signal (int $signo, callback $handler) 신호 프로세서를 설치합니다.
$signo는 처리할 신호 상수이고, callback은 처리 함수입니다.

pcntl_signal_dispatch () pcntl_signal() 설치된 프로세서를 통해 모든 대기 신호를 호출합니다

PHP 내에서 흔히 볼 수 있는 신호 상수는 다음과 같다

SIGCHLD 하위 프로세스를 종료합니다. 좀비 프로세스가 되면 상위 프로세스가 이 신호를 보냅니다.
SIGHUP 프로세스 중지
SIGTEM 프로세스 종료
... // 기타는 매뉴얼에서 확인하시기 바랍니다

신호 프로세서를 설치하고 호출한 후, 하위 프로세스에서 해당 신호가 부모 프로세스로 돌아오면, 부모 프로세스는 해당 callback 함수를 호출하여 하위 프로세스를 처리할 수 있습니다.

하위 프로세스 처리
하위 프로세스에 대한 처리 방법에는 다음이 있습니다.

posix_kill(): 이 함수는 이름 그대로가 아닙니다. 이 함수는 하위 프로세스로 신호를 보내며, 필요한 경우 하위 프로세스로 보낼 수 있습니다.하위 프로세스를 종료하는 프로세스 종료 신호

pcntl_waitpid(): 지정한 하위 프로세스가 이 함수에서 호출될 때 종료될 경우 fork의 하위 프로세스 상태를 기다리거나 반환합니다.이 함수는 즉시 반환되며 모든 하위 프로세스를 해제합니다.시스템 리소스, 이 프로세스는 하위 프로세스가 좀비 프로세스가 되어 시스템 리소스가 낭비되는 것을 방지할 수 있습니다.

다음은 두 함수의 함수 원형입니다.

bool posix_kill ( int $pid , int $sig ) // 프로세스 id가 $pid인 프로세스에 $sig 신호를 보내며, $sig는 상기와 같이 자주 사용됩니다;

int pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] )  // 현재 프로세스의 실행을 중지하고 프로세스 번호가 $pid인 프로세스가 종료될 때까지 기다립니다($pid가 -1일 경우 하위 프로세스 중 하나를 기다립니다)

결론
이것이 바로 PHP 다중 프로세스의 기초이며 관심 있는 사람은 직접 데모를 써서 시도해 볼 수 있습니다.

마지막으로 냐오빠가 말하는 PHP 멀티프로세스의 장점:

다중 프로세스를 사용하면 하위 프로세스가 종료된 후 커널이 자원 회수를 책임진다
다중 프로세스를 사용하면, 하위 프로세스가 비정상적으로 종료되어 전체 프로세스가 Threa로 이어지지 않습니다.d 종료. 상위 프로세스가 프로세스를 재구성할 수 있는 기회가 있습니다.
작업 분배만을 담당하는 상주 마스터 프로세스로 논리가 더 명확하다

 

반응형