2008-09-25 8 views
1

매분마다 cron 작업에서 호출되는 PHP 스크립트가 있습니다. 이 스크립트는 데이터베이스에서 정보를 취한 다음 System 함수 (일부 매개 변수 전달)를 사용하여 다른 PHP 스크립트를 호출합니다.프로세스가 종료 될 때까지 기다리지 마십시오.

즉,이 "기본"스크립트에서 최대 10 개의 스크립트를 시작할 수 있습니다. 그리고 내가하고 싶은 것은 스크립트를 호출하고 메인 스크립트의 실행을 계속하는 것입니다. 즉, 시스템 호출이 완료 될 때까지 기다리지 않고 다음 호출을 기다리는 것입니다.

어떻게이 작업을 수행 할 수 있습니까?

답변

3

이러한 종류의 작업을 수행하기 위해 proc_open(), stream_select()stream_set_blocking()을 함께 사용할 수 있습니다.

막연한 소리가 들리면 나는 비슷한 프로젝트를 수행하면서 최근의 프로젝트에서 사용했던 큰 코드 조각을 여기에 붙여 넣으려고했지만 도움이되기보다는 방해가 될 수 있다고 생각했습니다! 요약하지만, 코드는 다음과 같이 일 :

  1. 으로 cronjob는
  2. cronjob_wrapper.php cronjob_wrapper.php 호출하는 새로운 관리자 클래스를 만든 다음 그 위에 시작를 호출합니다.
  3. 관리자 클래스 시작 메소드는 실행중인 인스턴스 수 (특정 위치에서 pid 파일 찾기)를 확인합니다. 주어진 최대 인스턴스 수보다 작은 경우 자신의 프로세스 ID를 pid 파일에 쓴 다음 계속 수행합니다.
  4. 관리 클래스는 적절한 Encoder 클래스의 인스턴스를 만들고 exec을 호출합니다.
  5. exec 메서드는 proc_open, stream_select 및 stream_set_blocking을 사용하여 비 차단 방식으로 시스템 명령을 실행합니다 (이 경우 ffmpeg를 실행하면 꽤 오래 걸릴 수 있습니다!)
  6. 마침내 실행되면 PID 파일이 정리되고 해제됩니다.

내가 막연하고 수동적 인 이유는 여기서 우리의 다중 인스턴스가 PHP가 아닌 cronjob에 의해 처리되고 있기 때문입니다. 나는 당신이 이야기하고있는 것과 같은 것을 많이하려고 노력하고 있었고, pcntl_fork()과 친구들과 꽤 잘 작동하는 것을 얻었지만, 결국 나는 두 가지 문제를 겪었습니다. (적어도 하나는 PHP의 버그였습니다.) 이 접근 방식이 동일한 것을 달성하기위한보다 견고한 방법이라고 결정했습니다. YMMV.

이러한 기능을 살펴볼 가치가 있지만, 그 기능을 많이 얻을 수 있습니다. 비록 어떻게 든 PHP는 항상 소켓 프로그래밍 언어가 될 것이라고는 생각하지 않지만 ... :)

+0

action에있는 stream_select()를 보려면 비 차단 HTTP 요청을 발행 할 수있는 라이브러리가 있어야합니다 (예 :). (ping에 대해 생각해보십시오.) http://drupal.org/project/httprl에서 확인하십시오. Drupal 용이지만 약간의 변경만으로 자체적으로 실행할 수 있습니다. – mikeytown2

-1

은 fork 또는 threads의 php 버전을 사용합니다.

+0

PHP는 스레딩을 지원하지 않지만 fork()는 허용되는 옵션입니다. – Rob

1

OS에서 지원하는 경우 pcntl_fork() 기능을 사용하면 부모가 대기하지 않는 하위 프로세스를 스핀 오프 할 수 있습니다. 그러나 너무 많은 자식 프로세스를 실수로 생성하는 것은 쉽습니다 (특히 실행하는 데 예상보다 오래 걸릴 경우).

0

PHP가 스레딩을 지원하는지 잘 모르겠습니다. here을 확인하십시오.

-1

당신은 백그라운드에서 실행할 수 있습니다 : 당신은 당신이 실행중인 프로세스의 총 수를 확인 있는지 확인해야합니다

system('php yourscript.php &'); 

. 모두 훌륭한 고급 솔루션이 아닙니다. cron 대신에 하나의 스크립트를 영원히 돌릴 수 있습니다. 나는 다음과 같이 생각하고 있습니다.

<?php 
while(true) { 
    // do whatever needs to be done. 
} 
?> 

조심스럽게 생각합니다. PHP는 정확하게 데몬으로 사용되는 것은 아닙니다.

+3

나를 위해 작동하지 않습니다 .. 예 : 이 스크립트는 테스트 메시지를 작성하기 전에 5 초 동안 sleep 상태를 유지합니다. – Gart

관련 문제