Введение
Решил написать о многопоточности в PHP. Иногда бывает,что работа выполняется быстрее в нескольких потоках. Полноценную многопоточность как в Perl в PHP можно организовать с натяжкой. Но все же существует несколько способов
1)Запуск нескольких копий скрипта с помощью функции system
Код:
system("/usr/local/bin/php -f index.php par1 par2&");
Но этот вариант не практичный. Т.к. Нужен сервер с огромным каналом и огромным количеством Оперативной Памяти.
2)PHP Thread
Чесnно говоря метод для меня новый.НО как оказалаось весьма полезный.
master.php
Код:
<?php
$array = array( /*Создаем массив*/
0 => 'thread',
1 => 'hello',
2 => 'world');
thread_set('mySharedVar', $array);/*Расшариваем его для thread.php*/
thread_include('thread.php');/*Инклдуим thread.php*/
sleep(3);/*Ждем 3 секунды пока выполняется*/
echo 'Done';/*Выводим Done*/
?>
thread.php
Код:
<?php
$array = thread_get('mySharedVar');
print_r($array);
sleep(5);
echo 'Done';
?>
Честно стибрено Отсюда
3)Использование функции pcntl для организации (распараллеливания) процессов.
Основная функция
Код:
int pcntl_fork ( void )
Функция для создания дочерних процессов от основного.
Пример с мануала по PHP.
Код:
<?php
$pid*=*pcntl_fork();
if*($pid*==*-1)*{
*****die('could*not*fork');
}*else*if*($pid)*{
*****//*we*are*the*parent
*****pcntl_wait($status);*//Protect*against*Zombie*children
}*else*{
*****//*we*are*the*child
}
?>
Фунция pcntl_alarm(тайм аут). Дает сигнал следующему процессу через указанное количество секунд
Пример с мануала по PHP.
Код:
<?php
*** declare(ticks = 1);
*** function signal_handler($signal) {
** * ** print "Caught SIGALRM\n";
** * ** pcntl_alarm(5);
*** }
*** pcntl_signal(SIGALRM, "signal_handler", true);
*** pcntl_alarm(5);
*** for(; {
*** }
?>
pcntl_exec() Запуск еще одной программы одновременно с использованием скрипта. Можно юзать для запуска копии скрипта. Альтернатива 1 варианту
Код:
pcntl_exec("/usr/local/bin/php -f thread.php");
Скомбинировав эти фунции можно сделать многпоточность. Кстати, pcntl -это модуль, и его в стандартной сборке PHP нет.
Многпоточность в контексте сетевого взаимодействия
4)С помощью cURL(curl_multi)
Код:
$mh=curl_multi_init();//Открываем сессию curl_multi
// выполняем запрос
$running = null;
* do {
* * curl_multi_exec($mh, $running);
* } while($running> 0);
*
* // получаем данные и уничтожаем дискриптор
* foreach($curly as $id => $c) {
* * $result[$id] = curl_multi_getcontent($c);
* * curl_multi_remove_handle($mh, $c);
* }
*
* // закрываем многосложный дескриптор
* curl_multi_close($mh);
5)Неблокируемые сокеты
Можно использовать уже готовые классы с неблокируемыми сокетами,вы их без труда найдете если погуглите)
Либо
Код:
while(true)
{
//Код
if(max_threads=count($sock))
{
//Код
}
//Создаем сокет
$errno = 0;
$error = “”;
$socket = fsockopen($url_info[host], $url_info[port], $errno, $error, 30);
stream_set_blocking($socket, 0);
stream_set_timeout($socket, 3600);
fputs($socket, $query);
// запоминаем запущенный сокет
$sockets[md5(time())] = $socket;
Заключение
Ну вот в приницпе и все. Знаю,что написал бред,подкорректируйте плз.