Многопоточность в 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";
}
?>

Собственно все, - пока работает и нареканий нет...


Рекомендую также следующие статьи:

Оставить комментарий

Вы должны быть зарегистрированы чтобы комментировать.

Потребление памяти: 28.97MB