Функциональный PHP: Многопоточный парсер

Второй мастер-класс по функциональному программированию в PHP на примере написания многопоточного парсера активных участников форума. Рассмотрели базовую реализацию многопоточности в PHP и отличия от других языков программирования:

Открыть на YouTube | Исходники примера | Вебинар о подсчёте стоимости

Приглашаю на следующие видеоуроки. Анонс и ссылку на эфир, как обычно, пришлю в отдельной рассылке по вебинарам:

И задавайте вопросы в комментариях. Заранее спасибо и до встречи в эфире!

Комментарии

 

Евгений Левачев

Спасибо, очень интересный инфа

Ответить

 

Валерий

PHP-борода+усы снова в эфире! Я удивляюсь терпению Дмитрия записать видео на 205 минут! Это 3 часа 25 минут рассказывать про написание парсера!!!
Снимаю шляпу!
Серьезно!

Ответить

 

Денис

у вас мощная воля, респект вам!

Ответить

 

Виктор

На всякий случай - длина файла - filesize($childPid . '.txt')

Ответить

 

Александр

Хороший материал, только автор смешивает или путает два понятия процессы и потоки. Да fork порождает новый процесс, а не поток, а следовательно парсер мультипроцессный, а не мультипоточный. Мультипоточность тоже есть (создание новых потоков они же threads ) через pthreads https://github.com/krakjoe/pthreads только нужна thread-safe сборка php.

Ответить

 

Дмитрий Елисеев

В комментариях на YouTube про это уже говорили.

Ответить

 

Михаил

Дмитрий, спасибо! Ваши уроки замечательные, но видео больше 3 часов - это очень долго. Возможно, стоит подумать как можно сократить, оставив самое интересное. Например, в этом видео для меня было интересно работа с процессами, подключение краулера, подход к конфигурированию функций. А тонкости реализации самого парсера, которые занимают примерно половину времени не очень.

Ответить

 

slo_nik

Добро утро, Дмитрий.
Тема старая, но надеюсь на Ваш ответ.
Пытаюсь повторить, то, о чём Вы тут рассказали.
Но при использовании parallel_map() у меня вываливаются ошибки

fire_get_contents(http://site.com): failed to open stream: HTTP request failed! HTTP/1.1 508 Loop Detected

и

fire_get_contents(http://site.com): failed to open stream: HTTP request failed! HTTP/1.1 507 Loop Detected

Это происходит, если директория с кэшем пустая. Приходится несколько раз запускать скрипт, пока не создадутся все файлы страниц в кэше.
Как только заполнится - ошибка уходи и всё работает как положено.
Единственно, что я понял из поиска решения, это то, что происходит зацикливание на сервере, но как это решить - не пойму.

Ответить

 

slo_nik

Если заменить parallel_map() на обычный array_map() скрипт работает без ошибок вне зависимости, есть файлы в кэше или нет.

Ответить

 

slo_nik

Доброй ночи.
Понял свою ошибку, теперь работает без ошибки.
Ошибка была в том, что я пытался обработать массив из 140 ссылок, чтобы получить ссылки на все страницы товаров с учётом пагинации. В итоговом массиве получилось 250 ссылок. Сервер не выдерживал, то о чём Вы, Дмитрий, говорили.
Благодарю за это видео.

Ответить

 

Kirill

Дмитрий, добрый день!
Подскажите, как парсер из видео справится с задачей в несколько миллионов спарсенных страниц?

Спасибо

Ответить

 

Дмитрий Елисеев

За долгое время справится.

Ответить

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

Войти | Завести аккаунт | Войти через


(никто не увидит)





Можно использовать теги <p> <ul> <li> <b> <i> <a> <pre>