ベローは@chaos答えの私たちの作業の実装であるためPCNTLプラグイン型サーバデーモン。このスクリプトは通常わずか数ミリ秒であるため、シグナルを処理するコードは削除されました。
また、コードでは、呼び出し間にpidを保存する2つの関数restore_processors_state()とsave_processors_state()を追加しました。 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は –