2012-06-03 19 views

답변

26

PCNTL은 스레드를 만들 수 없습니다. 현재 PHP 프로세스 만 "fork"합니다. 무슨 뜻이에요? pcntl_fork()으로 전화하면 현재 프로세스가 두 개의 프로세스로 분할됩니다. 상위 프로세스의 전체 네임 스페이스가 하위 프로세스에 복사되고 두 프로세스가 하나의 차이와 함께 실행을 계속합니다. pcntl_fork()은 상위의 하위 PID를 반환하고 하위는 0을 반환합니다.

일부 힌트 :

  • 은 기본적으로 비활성화되어 있습니다. 활성화하려면 CLI 전용으로하십시오. 웹 서버와 함께 사용하지 마십시오! 비 결정적 방식으로 작동합니다. 그것은 또한 전체 기계를 다운시킬 수 있습니다. 제발, 사용하지 말고 계속 읽으십시오.
  • 프로세스간에 통신이 가능하지만 무서울 수도 있습니다 (공유 메모리의 직렬화 된 객체를 통해).
  • 파일 설명자 (및 데이터베이스 연결)가 공유되므로 문제가 자주 발생합니다. 을 포크 한 후 DB를 다시 연결해야합니다. 그렇지 않으면 첫 번째 포트가 연결을 닫을 때 모든 포크 된 프로세스에서 MySQL server has gone away과 같은 오류가 발생합니다.
  • 부모 프로세스는 자식이 끝날 때까지 기다려야하거나 좀비를 떠날 것입니다. 프로세스가 시스템 리소스를 소비합니다.

여기 예를 from documentation입니다 :

<?php 

$pid = pcntl_fork(); 
if ($pid == -1) { 
    die('could not fork'); 
} else if ($pid) { 
    // we are the parent 
    pcntl_wait($status); //Protect against Zombie children 
} else { 
    // we are the child 
} 

하지만 기억, PHP는 언어를 스크립팅있다. 병렬 컴퓨팅을 위해 설계된 것은 아닙니다. 필요에 따라 CRON, 메시지 대기열 또는 프로그램을 저급 언어로 동시에 실행하면 더 효율적으로 일할 수 있습니다.

포크로 묶인 PHP 프로그램은 읽고 이해하기 쉽고 디버그하기가 어렵습니다. 그 프로그램을 유지하는 것은 악몽 일 것입니다.

실수하지 말고 분기하지 마십시오. 너는 필요 없어. 당신이 정말로 필요로하는 것은 비동기 작업 주자입니다. 포크 (fork)는 당신에게 또 하나 개의 이점을 제공하는 대신 사용하여 메시지 큐 : 뉴스 좋은, 또한 RabbitMQ 라이브러리를 약속 시도 할 수 있습니다 ;-) RabbitMQnice tutorial이는 Bunny

PS했다. 여러 서버로 대기열을 처리하고 트래픽이 증가함에 따라 수평으로 확장 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다 :) –

관련 문제