Многопоточность в PHP 5.3.2
Понадобилось в несколько потоков данные обрабатывать. Писать свой класс для работы с системными функциями PHP неохота, тем более, все-таки, не люблю я всякие proc_open, system и т. д.
Появилось решение использовать аналог fork от perl, да-да, таковой имеется у PHP в виде библиотеки pcntl.
Итак, исходные данные:
- Сервер - FreeBSD 8;
- PHP - 5.2.3;
- Последняя версия портов;
Собираем библиотеку pcntl:
# cd /usr/ports # make search name=pcntl # cd /usr/ports/devel/php5-pcntl # make install
А дальше начинается работа с PHP.
<?php
// задаем кол-во потоков
$threads = 10;
$i = 0;
$pid_arr = array();
while ($i < intval($threads))
{
$pid = pcntl_fork(); // вот он, - знакомый до боли fork()
if ($pid == -1)
{
die('could not fork');
}
else
{
if ($pid) // parent
{
$pid_arr[$i] = $pid;
}
else // child
{
somefunction($i+1); // функция, которая будет основой в дочернем процессе...
// делаем выход или процессы будут продолжать плодиться
exit(0);
}
}
$i++;
}
foreach ($pid_arr as $pid)
{
pcntl_waitpid($pid, $status);
}
function somefunction($i){
print "fucntion thread - $i\n";
}
?>
Собственно все, - пока работает и нареканий нет...
Рекомендую также следующие статьи:
