BoBka-altRUist
Новичок
fork порождение процессов
расскажите пожалуйста как работает pcntl
я так понимаю если мне нужно запустить скрипт sub.php в несколько дочерних процессов, и чтобы
их контролировал родительский main.php мне нужно использовать pcntl
в мануале смотрел (в поиске тоже, но в основном народ приходил к решению использовать что-то другое)
но вот в этом примере (это пример с php.net):
мне не ясно как тут работают сигналы
почему не происходит вызова функции sig_handler ?
и для чего функция posix_setsid ?
нашел еще одно описание которое получше того что на php.net
вот: http://www.electrictoolbox.com/article/php/process-forking/
пример оттуда:
все хорошо но, когда происходит вызов pcntl_waitpid то родительский процесс ждет завершения
этого процесса, после его завершения ждет завершения второго, и потом третьего,
а вдруг первый - самый длительный...
тут по идее должны помочь те сигналы которые бы сообщали о завершении какого-то процесса и можно было ему давать новое задание.
у меня такое ощущение что на pcntl разработчики забили или все используют другие решения, потому как на php.net ни комментариев не примеров...
да, еще, я могу передавать из дочерних процессов в родительский значение каких-либо переменных?
вот еще решение http://github.com/danhen/php_threads/tree/master но похоже до сих пор нестабильное (и мне все же хотелось узнать о pcntl)
расскажите пожалуйста как работает pcntl
я так понимаю если мне нужно запустить скрипт sub.php в несколько дочерних процессов, и чтобы
их контролировал родительский main.php мне нужно использовать pcntl
в мануале смотрел (в поиске тоже, но в основном народ приходил к решению использовать что-то другое)
но вот в этом примере (это пример с php.net):
PHP:
<?php
declare(ticks=1);
$pid = pcntl_fork();
if ($pid == -1) {
echo "could not fork\n";
die("could not fork");
} else if ($pid) {
echo "we are the parent\n";
exit(); // we are the parent
} else {
echo "we are the child\n";
sleep(15);
// we are the child
}
// detatch from the controlling terminal
if (posix_setsid() == -1) {
die("could not detach from terminal");
}
// setup signal handlers
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
// loop forever performing tasks
while (1) {
echo "do something interesting here\n";
sleep(8);
// do something interesting here
}
function sig_handler($signo)
{
switch ($signo) {
case SIGTERM:
// handle shutdown tasks
echo "handle shutdown tasks\n";
exit;
break;
case SIGHUP:
// handle restart tasks
echo "handle restart tasks\n";
break;
default:
// handle all other signals
echo "handle all other signals\n";
}
}
?>
почему не происходит вызова функции sig_handler ?
и для чего функция posix_setsid ?
нашел еще одно описание которое получше того что на php.net
вот: http://www.electrictoolbox.com/article/php/process-forking/
пример оттуда:
PHP:
$pids = array();
for($i = 0; $i < 3; $i++) {
$pids[$i] = pcntl_fork();
echo $pids[$i]."\n";
if ($pids[$i] == -1) {
echo "could not fork\n";
die("could not fork");
} else if ($pids[$i]) {
echo "we are the parent\n";
//exit(); // we are the parent
} else if(!$pids[$i]) {
// child process
echo "child process\n";
//...
echo "i am proc ".$i." - ".$pids[$i]."\n";
sleep(rand(5,10));
exit();
}
}
for($i = 0; $i < 3; $i++) {
pcntl_waitpid($pids[$i], $status, WUNTRACED);
}
echo "complete parent processing now all children have finished\n";
...
этого процесса, после его завершения ждет завершения второго, и потом третьего,
а вдруг первый - самый длительный...
тут по идее должны помочь те сигналы которые бы сообщали о завершении какого-то процесса и можно было ему давать новое задание.
у меня такое ощущение что на pcntl разработчики забили или все используют другие решения, потому как на php.net ни комментариев не примеров...
да, еще, я могу передавать из дочерних процессов в родительский значение каких-либо переменных?
вот еще решение http://github.com/danhen/php_threads/tree/master но похоже до сих пор нестабильное (и мне все же хотелось узнать о pcntl)

(у вас похоже мания - всем говорить про то что в perl и java есть многопоточность Krishna подтвердит)