Я бы воспользовался pcntl функциями. Если кратко, то код выглядит следующим образом (просто для пояснения идеи)
<?php
runDaemon(10);
function runDaemon( $aMaxWorkers )
{
$i = 0;
for ( ; $i < $aMaxWorkers; $i++ )
{
forkWorker( $i );
}
while ( ( $pid = pcntl_wait( $status ) ) != -1 )
{
echo "Exit $pid\n";
forkWorker( $i++ );
}
}
function forkWorker( $aNumber )
{
$pid = pcntl_fork();
if ( $pid )
{
echo "Start #$aNumber, pid $pid\n";
return;
}
// Делаем свою работу и выходим
sleep(5);
exit;
}
?>
Но у него есть один незначительный недостаток —
он не работает pcntl_wait может не отловить одновременный выход двух работников и не запустит нужное число новых.
К счастью, умные люди уже все придумали. Вот
рабочий код. Просто добавьте запуск новых работников в этот бесконечный цикл:
while(count($this->currentJobs)){
echo "Waiting for current jobs to finish... \n";
sleep(1);
}