Körük @ kaos cevap bizim çalışma uygulamasıdır. Sinyallerini işlemek için kod bu komut genellikle sadece birkaç milisaniyede yaşıyor olarak çıkarıldı.
Ayrıca, kodu biz çağrıları arasında pids kurtarmak için 2 fonksiyonlar ekledi: restore_processors_state () ve save_processors_state (). Biz redis orada kullanılan, ama dosyalar üzerinde uygulamasını kullanmaya karar verebilirsiniz.
Biz bu komut dosyasını cron kullanarak her dakika çalıştırın. Tüm işlemler hayatta ise Cron denetler. Değilse - onları yeniden çalıştırın ve daha sonra ölür. Biz mevcut süreçleri öldürmek istiyorsanız o zaman sadece argümanı ile bu komut dosyasını çalıştırmak kill: php script.php kill.
Init.d. içine komut enjekte olmadan işçi çalıştıran çok kullanışlı bir yoldur
<?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();