Bellow @chaos जवाब के बारे में हमारी काम करने कार्यान्वयन है के लिए एक pcntl प्लगइन प्रकार सर्वर डेमॉन। सिग्नल को संभालने के लिए कोड हटा दिया गया था क्योंकि इस स्क्रिप्ट में आमतौर पर केवल कुछ मिलीसेकंड रहते हैं।
इसके अलावा, कोड में हमने कॉल के बीच पिड्स को बचाने के लिए 2 फ़ंक्शंस जोड़े: restore_processors_state() और save_processors_state()। हमने वहां redis
का उपयोग किया है, लेकिन आप फ़ाइलों पर कार्यान्वयन का उपयोग करने का निर्णय ले सकते हैं।
हम क्रॉन का उपयोग करके हर मिनट इस स्क्रिप्ट को चलाते हैं। क्रॉन जांचता है कि क्या सभी प्रक्रियाएं जीवित हैं। यदि नहीं - तो यह उन्हें फिर से चलाता है और फिर मर जाता है। अगर हम मौजूदा प्रक्रियाओं को मारना चाहते हैं तो हम इस स्क्रिप्ट को तर्क 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();
स्रोत
2013-11-18 08:19:06
यह भी देखें: http://symfony.com/doc/master/components/process.html –