이러한 종류의 작업을 수행하기 위해 proc_open()
, stream_select()
및 stream_set_blocking()
을 함께 사용할 수 있습니다.
막연한 소리가 들리면 나는 비슷한 프로젝트를 수행하면서 최근의 프로젝트에서 사용했던 큰 코드 조각을 여기에 붙여 넣으려고했지만 도움이되기보다는 방해가 될 수 있다고 생각했습니다! 요약하지만, 코드는 다음과 같이 일 :
- 으로 cronjob는
- cronjob_wrapper.php cronjob_wrapper.php 호출하는 새로운 관리자 클래스를 만든 다음 그 위에 시작를 호출합니다.
- 관리자 클래스 시작 메소드는 실행중인 인스턴스 수 (특정 위치에서 pid 파일 찾기)를 확인합니다. 주어진 최대 인스턴스 수보다 작은 경우 자신의 프로세스 ID를 pid 파일에 쓴 다음 계속 수행합니다.
- 관리 클래스는 적절한 Encoder 클래스의 인스턴스를 만들고 exec을 호출합니다.
- exec 메서드는 proc_open, stream_select 및 stream_set_blocking을 사용하여 비 차단 방식으로 시스템 명령을 실행합니다 (이 경우 ffmpeg를 실행하면 꽤 오래 걸릴 수 있습니다!)
- 마침내 실행되면 PID 파일이 정리되고 해제됩니다.
내가 막연하고 수동적 인 이유는 여기서 우리의 다중 인스턴스가 PHP가 아닌 cronjob에 의해 처리되고 있기 때문입니다. 나는 당신이 이야기하고있는 것과 같은 것을 많이하려고 노력하고 있었고, pcntl_fork()
과 친구들과 꽤 잘 작동하는 것을 얻었지만, 결국 나는 두 가지 문제를 겪었습니다. (적어도 하나는 PHP의 버그였습니다.) 이 접근 방식이 동일한 것을 달성하기위한보다 견고한 방법이라고 결정했습니다. YMMV.
이러한 기능을 살펴볼 가치가 있지만, 그 기능을 많이 얻을 수 있습니다. 비록 어떻게 든 PHP는 항상 소켓 프로그래밍 언어가 될 것이라고는 생각하지 않지만 ... :)
action에있는 stream_select()를 보려면 비 차단 HTTP 요청을 발행 할 수있는 라이브러리가 있어야합니다 (예 :). (ping에 대해 생각해보십시오.) http://drupal.org/project/httprl에서 확인하십시오. Drupal 용이지만 약간의 변경만으로 자체적으로 실행할 수 있습니다. – mikeytown2