저는 시간이 많이 걸리는 작업을 별도의 프로세스로 추출하려고합니다. 불행히도 멀티 스레딩은 PHP에서는 옵션이 아닌 것 같지만 popen을 사용하여 새로운 PHP 프로세스를 만들 수 있습니다.PHP popen 프로세스 제한?
유스 케이스는 다음과 같습니다. 매분마다 실행되는 cronjob이 있으며, 전송해야하는 이메일 캠페인이 있는지 확인합니다. 정확한 시간에 여러 캠페인을 보내야 할 수도 있지만, 지금은 매분마다 하나의 캠페인 만 선택합니다. 별도의 프로세스로 캠페인을 보내고 싶습니다. 동시에 여러 캠페인을 보낼 수 있습니다.
crontab을
* * * * * root /usr/local/bin/php /var/www/maintask.php 2>&1
maintask.php
for ($i = 0; $i < 4; $i++) {
$processName = "Process_{$i}";
echo "Spawn process {$processName}" . PHP_EOL;
$process = popen("php subtask.php?process_name={$processName} 2>&1", "r");
stream_set_blocking($process, false);
}
하위 :
코드는 다음과 같이 (이 개념의 단지 증거주의) 보이는 .php
$process = $_GET['process_name'];
echo "Started sleeping process {$process}" . PHP_EOL;
sleep(rand(10, 40));
echo "Stopped sleeping process {$process}" . PHP_EOL;
이제는 popen이 4를 생성하려고 시도하는 동안 popen은 언제든지 2 개의 프로세스 만 생성한다는 문제가 있습니다. 이유는 알 수 없습니다. 문서화 된 한계가없는 것 같습니다. 아마 이것은 내가 사용할 수있는 코어의 양에 의해 제한됩니까?
[proc_open()] (http://php.net/manual/en/function.proc-open.php) 이전에는 성공적으로 만들 수 있습니다 여러 자식 프로세스. 문제가 해결 되었습니까? –
코드 세그먼트를 파헤쳐 볼 수 있습니까? 코드가 동시에 2 개의 프로세스 만 실행한다는 것을 어떻게 알 수 있습니까? 게시물의 코드로는이를 테스트 할 수 없습니다. –
@WeeZel 불행히도 아직이 문제를 해결할 수 없었습니다. "ps -aux"를 사용하여 활성 프로세스를 모니터링하여 실행중인 프로세스가 2 개뿐인지 확인했습니다. subtask.php 프로세스 중 하나가 완료 되 자마자 새로운 것이 발생합니다. 제공된 코드에 대해 알고 있다고 생각합니다. 단순히 너무 복잡하게 만드는 모든 실제 코드를 게시하지 않고 단순히 달성하려는 것을 보여주기위한 시도였습니다. 내 문제의 작업 시연을하고 원래 게시물을 업데이트 할 수 있는지 알게 될 것입니다. 감사! –