우는 소리가 @chaos 대답 우리의 작업 구현을위한 pcntl 플러그인 타입 서버 데몬. 이 스크립트는 대개 몇 밀리 초 밖에 걸리지 않으므로 신호 처리 코드가 제거되었습니다.
또한 코드에서 restore_processors_state() 및 save_processors_state() 호출간에 pid를 저장하는 두 가지 기능을 추가했습니다. 여기에 redis
을 사용했지만 파일에 구현을 사용하도록 결정할 수 있습니다.
우리는 cron을 사용하여 매분이 스크립트를 실행합니다. Cron은 모든 프로세스가 살아 있는지 확인합니다. 그렇지 않으면 다시 실행하여 죽게됩니다. 기존 프로세스를 종료하려면이 스크립트를 인수 kill
: php script.php kill
으로 실행하면됩니다.
init.d에 스크립트를 삽입하지 않고 작업자를 실행하는 매우 편리한 방법입니다.
<?php
include_once dirname(__FILE__) . '/path/to/bootstrap.php';
define('WANT_PROCESSORS', 5);
define('PROCESSOR_EXECUTABLE', '' . dirname(__FILE__) . '/path/to/worker.php');
set_time_limit(0);
$run = true;
$reload = false;
declare(ticks = 30);
function restore_processors_state()
{
global $processors;
$redis = Zend_Registry::get('redis');
$pids = $redis->hget('worker_procs', 'pids');
if(!$pids)
{
$processors = array();
}
else
{
$processors = json_decode($pids, true);
}
}
function save_processors_state()
{
global $processors;
$redis = Zend_Registry::get('redis');
$redis->hset('worker_procs', 'pids', json_encode($processors));
}
function spawn_processor() {
$pid = pcntl_fork();
if($pid) {
global $processors;
$processors[] = $pid;
} else {
if(posix_setsid() == -1)
die("Forked process could not detach from terminal\n");
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
pcntl_exec('/usr/bin/php', array(PROCESSOR_EXECUTABLE));
die('Failed to fork ' . PROCESSOR_EXECUTABLE . "\n");
}
}
function spawn_processors() {
restore_processors_state();
check_processors();
save_processors_state();
}
function kill_processors() {
global $processors;
foreach($processors as $processor)
posix_kill($processor, SIGTERM);
foreach($processors as $processor)
pcntl_waitpid($processor, $trash);
unset($processors);
}
function check_processors() {
global $processors;
$valid = array();
foreach($processors as $processor) {
pcntl_waitpid($processor, $status, WNOHANG);
if(posix_getsid($processor))
$valid[] = $processor;
}
$processors = $valid;
if(count($processors) > WANT_PROCESSORS) {
for($ix = count($processors) - 1; $ix >= WANT_PROCESSORS; $ix--)
posix_kill($processors[$ix], SIGTERM);
for($ix = count($processors) - 1; $ix >= WANT_PROCESSORS; $ix--)
pcntl_waitpid($processors[$ix], $trash);
}
elseif(count($processors) < WANT_PROCESSORS) {
for($ix = count($processors); $ix < WANT_PROCESSORS; $ix++)
spawn_processor();
}
}
if(isset($argv) && count($argv) > 1) {
if($argv[1] == 'kill') {
restore_processors_state();
kill_processors();
save_processors_state();
exit(0);
}
}
spawn_processors();
참조 :이셨어요 경우 http://symfony.com/doc/master/components/process.html –