Многопоточность в php
pcntl_fork не подойдёт ?
Что-то не получается у меня с этим разобраться... но такое ощущение, что это всё-таки не особо лучше, чем способ из моего поста (лучше - тем, что есть возможность общаться с дочерними процессами, но что-то я не соображу, какую в моём случае из этого можно извлечь пользу.
Там есть какая-то функция pcntl_signal... но у меня что-то не получается разобраться в ней... кто-нибудь может на пальцах объяснить (или посоветовать, что искать в гугле/что не очень объёмное прочитать как можно породить процесс (какая-то функция, но, вообще-то говоря, это может быть и отдельный скрипт - как, насколько я понимаю, в этом случае и надо делать и, когда он отработает, получить его вывод (не число, а достаточно объёмные данные - я так понял, в этом случае надо как-то устроить общение между процессами - это вообще непонятно, как делать - с помощью posix_mkfifo? так, чтобы это "получение вывода" было отдельной функцией, запускаемой после отработки порождённого процесса - и чтобы основная ветвь основного скрипта продолжила работу сразу после запуска этого нового процесса - и можно было бы, не дожидаясь окончания его работы, выполнять ещё что-то (в частности, запускать новые акие же дочерние процессы)...
Зачем тебе такое? Опиши реальную задачу, а то даже представить сложно, зачем такое может понадобиться...
Так-то сделать это довольно просто, но хочется как-то распараллелить процесс закачки. Есть вариант с использованием curl_multi, но он плох по двум причинам:
1) Приходится ждать окончания загрузки _всех_ ссылок, выдранных с текущей - а хочется так - загрузилась одна и тут же обработалась, загрузилась третья и тут же обработалась, загрузилась вторая - и обработалась (с последующим запуском закачек уже по ссылке с этой второй).
2) Если мы скачали все, допустим, три ссылки с текущей страницы - пока мы не обработаем первую скачанную страницу (где работы, может быть, ещё на много нераспаралеленных часов не перейдём к обработке следующих.
Конечно, при таком желаемом подходе, который в первом посте, всё равно остаются проблемы (надо ограничить количество одновременных закачек; надо хорошо организовать очередь, чтобы предпочтение отдавалось закачкам более высокого "уровня") - но это, по-моему, уже можно решить...
Делал так, запускал процесс с помощью proc_open передавал ему урл, в нем все что надо парсилось и передовалось обратно. Обновременно работало до 30 дочерних процессов. В материнском процессе, только следил за окончанием того иил иного процесса, брал от него выхлап и вбивал в базу.
Оставить комментарий
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[,...]]]).
Хочется, чтобы код
выдавал 123...