Оффициальной нет, сразу скажу. Есть только многочисленные костылики. Примеры, в основном, будут полезны в сео софте.
Встала вобщем задача передо мной – накатать многопоточный нескажу что, причем не просто многопоточный, а чтобы еще и потоками можно было управлять, как в том же делфи. То есть, чтобы можно было поток остановить, запустить, запауазить, возобновить и потоки еще должны оповещать о своем состоянии, мол в данный момент выполняю то-то.
Собсно, теория реализации.
Два скрипта – один поток, второй запускалка потоков. Поток делает свои дела, запускалка вычисляет, сколько потоков запустить и с какими параметрами.
Пример первый, запускает 20 потоков, если общее количество потоков ниже чем 10
<?php
while(2 > 1):
$thCount = exec("ps a | thread.php | wc -l");
echo $thCount."\r\n";
if($thCount < 10){
for($i = 0; $i < 20; $i++){
echo "launch thread\r\n";
passthru("(php -f thread.php & ) >> /dev/null 2>&1");
//sleep(1);
}
} else {
sleep(5);
}
endwhile;
?>
Получается хрень, которая дозапускает потоки время от времени по условию. Потоков всегда разное число в разные промежутки времени и остановить их никак нельзя. Но, если некритичны все эти вещи, цикл вполне неплохо работает. Подходит, например, всякие регеры. При допилке можно держать нужное количество потоков с погрешностью +- 1. Для этого нужно просто динамически вычислять число запускаемых потоков. Да, и ps показывает три работающих потока при таком вызове, даже если нет ни одного. Один дает греп, второй сам скрипт, третий фиг знает кто.
Вариант 2.
Тут уже захотелось сделать более гибкую штуку. А именно – взять например 1к урлов и раздать их поровну N потокам.
<?php
$threads = 10;
$base = file("base.txt");
$perThread = ceil(count($base) / $threads);
for($i = 0; $i < $threads; $i++){
if($i == 0) { passthru("(php -f thread.php '0|".$perThread."' & ) >> /dev/null 2>&1"); }
if($i == $threads-1) { passthru("(php -f thread.php '".$perThread * $i."|".count($base)."' & ) >> /dev/null 2>&1"); }
if(($i !== 0)&&($i !== $threads-1)) {
$start = $perThread * $i + 1;
$end = $start -1 + $perThread;
passthru("(php -f thread.php '".$start."|".$end."' & ) >> /dev/null 2>&1");
}
}
?>
Данный пример запускает поток с параметрами, который тот потом достает из массива $argv и использует. Такое вот разделение труда.
Взаимодействие между потоком и «мамой».
Тут у меня только теория. Думаю реализовать это через файлы. Поток создает файл с именем своей сессии (номера, пида), мама читает оттуда. Чтобы вывести инфу о потоках красиво и наглядно, думаю заюзать ncurses. Это сишная либа, на ней сделаны midnight commander, top. Доступна не только для пхп.
Изменения состояний потоков.
Так и не придумал. Можно попробовать через теже файлы, но это надо после каждой строчки кода потока вставлять проверку файла на наличии там указаний. Скорость само собой упадет. Да и при таких реализациях мама убивается только вручную.
Саня, он же похапэ дуд , сразу обрубил – Я бы такие задачи не решал на php. Я тоже посматриваю в сторону других языков, думаю выучить что-то типа си, но пока я выучу, мне наверно уже ничего не надо будет. Есть вариант на питоне. И как раз в ридере попалась статья одного камрада, который начал изучать его и привел примерчик.
Вариант ,как по мне, не очень, бесконечные потоки и в пхп можно пускать. Но в посте увидел ссылочку, третий примерчик очень похож на то, что надо. Плюс питона еще в том, что в нем можно использовать графические либы типа gtk или qt, а это уже полноценные проги для енд-юзера а не софт для консольных гиков.
memcached php
установка memcached
скрипт опроса ajax
15 responses
Do you want to comment?
Comments RSS and TrackBack Identifier URI ?
Trackbacks