Многопоточность в php

kruzer25

Такое вообще можно как-нибудь сделать, без извратов со всякими exec("start php.exe abc.php")?
Вообще-то, нужно что-то типа curl_multi, но умнее - чтобы была какая-то функция типа
curl_start(object $curl_handle,string $function_called_after_executing[,mixed $optional_parameter1,[mixed $optional_parameter2[,...]]]).
Хочется, чтобы код
<?
function test($ch,$num) {
echo "2".$num;
}
$ch=curl_init("http://www.ya.ru/");
curl_start($ch,3);
echo 1;
?>

выдавал 123...

NAIL

pcntl_fork не подойдёт ?

kruzer25

Что-то не получается у меня с этим разобраться... но такое ощущение, что это всё-таки не особо лучше, чем способ из моего поста (лучше - тем, что есть возможность общаться с дочерними процессами, но что-то я не соображу, какую в моём случае из этого можно извлечь пользу.

kruzer25

Там есть какая-то функция pcntl_signal... но у меня что-то не получается разобраться в ней... кто-нибудь может на пальцах объяснить (или посоветовать, что искать в гугле/что не очень объёмное прочитать как можно породить процесс (какая-то функция, но, вообще-то говоря, это может быть и отдельный скрипт - как, насколько я понимаю, в этом случае и надо делать и, когда он отработает, получить его вывод (не число, а достаточно объёмные данные - я так понял, в этом случае надо как-то устроить общение между процессами - это вообще непонятно, как делать - с помощью posix_mkfifo? так, чтобы это "получение вывода" было отдельной функцией, запускаемой после отработки порождённого процесса - и чтобы основная ветвь основного скрипта продолжила работу сразу после запуска этого нового процесса - и можно было бы, не дожидаясь окончания его работы, выполнять ещё что-то (в частности, запускать новые акие же дочерние процессы)...

Werdna

Зачем тебе такое? Опиши реальную задачу, а то даже представить сложно, зачем такое может понадобиться...

kruzer25

Реальная задаа - нужно написать некоторый обработчик некоторого web-ресурса - получать страницы из списка, каждую страницу обрабатывать, получать оттуда некоторые ссылки и закачивать их содержимое, затем обрабатывая - уже, возможно, другой функцией (такая "рекурсивная" (потому что на самом деле всё не совсем так просто) закачка страниц).
Так-то сделать это довольно просто, но хочется как-то распараллелить процесс закачки. Есть вариант с использованием curl_multi, но он плох по двум причинам:
1) Приходится ждать окончания загрузки _всех_ ссылок, выдранных с текущей - а хочется так - загрузилась одна и тут же обработалась, загрузилась третья и тут же обработалась, загрузилась вторая - и обработалась (с последующим запуском закачек уже по ссылке с этой второй).
2) Если мы скачали все, допустим, три ссылки с текущей страницы - пока мы не обработаем первую скачанную страницу (где работы, может быть, ещё на много нераспаралеленных часов не перейдём к обработке следующих.
Конечно, при таком желаемом подходе, который в первом посте, всё равно остаются проблемы (надо ограничить количество одновременных закачек; надо хорошо организовать очередь, чтобы предпочтение отдавалось закачкам более высокого "уровня") - но это, по-моему, уже можно решить...

stat7819605

Пытался как-то разобраться с форками, но так и не понял как передавать дочерним процессам и получать от них данные. Решил сделать все с помощью proc_open.
 
Делал так, запускал процесс с помощью proc_open передавал ему урл, в нем все что надо парсилось и передовалось обратно. Обновременно работало до 30 дочерних процессов. В материнском процессе, только следил за окончанием того иил иного процесса, брал от него выхлап и вбивал в базу.
 
Оставить комментарий
Имя или ник:
Комментарий: