При написании скриптов-парсеров все рано или поздно приходят к вопросу о многопоточной реализации оных.
Я не стал исключением и изучил довольно много информации по данному вопросу и пришел к выводу — нужно реализовывать на неблокируемых сокетах (мультикурл мне не понравился тем, что он может обрабатывать только пачками, т.е. при обработке 100 урлов на конечном этапе имеем снижение производительности — допустим 98 уже обработалось и вся система ждет обработку каких то 2х тормозных урлов, в конечном итоге теряя время).
Плотно пошарив в инете нашёл таки класс AunoAsyncHttp, на котором в дальнейшем я и выстраивал все свои многопоточные скрипты.
Кому интересны дебаты на счёт многопоточности вот пару интересных тем с умакс-форума:
На всякий случай выложу его на своем хостинге (а то мало ли) — AunoAsyncHttp
На этом всё — enjoy.
И ещё — PHP программистам: очень хотелось бы почитать в комментах ваше мнение о данном классе! Какую реализацию многопоточности в PHP используете Вы ?
9 комментариев на «“Многопоточность в PHP”»
ну не многопоточность а асинхронные неблокируемые, зачем придумывать…
а вообще я раньше смотрел на сокет селект, но после прочтения -A d u l t-а стало ясно что проще и надежнее через циклы с проверками на сосотояния и ошибками
а вообще класс так и построен почти — как мне показалось на первый взгляд — не полная обработка ошибок — но если все работает всегда без сбоев — то я наверное ошибся
Для чего нужна многопоточность? Если для загрузки чего либо из интернета, то тут основная проблема в том, что соединение может зависнуть
в любом самом неожиданном месте, например при резолве хоста. То есть загнётся и мультикурл и этот класс и любой другой способ, в котором
ВСЕ операции, влючая резолв не разнесены по разным потокам. То есть для устойчивой многопоточности, надо гарантировать, что ни один поток
не заткнётся или заткнувшись не остановит все остальные. Я делаю так — открываю много соединений сам с собой, просто дёргаю тот же скрипт
с нужными параметрами, а этот скрипт видя что его об этом просят — скачивает требуемые урлы и отдаёт их главному потоку. Шансов что сервер
сам до себя не сможет достучаться немного, а если зависнет какой-то из вспомогательных потоков — это не так страшно. 🙂 Этот подход работат
почти на любых хостингах, но за универсальность приходится платить — способ ресурсоёмкий. Если можно запускать консольные команды, то можно
модифицировать способ — вместо того чтобы открывать соединение сам с собой, запустить кучу пхп процессов. Правда не знаю что будет, если
часть процессов будет зависать, очистит ли их линукс автоматически или они тыщами будут сидеть в памяти.
Как я понял этот класс не может выполнять POST запросы?
в исходном виде нет, модифицируй под себя — и будет 🙂
к проблеме многопоточности я подошёл с другой стороны — использовал AJAX и асинхронные запросы.
Пора изучать Php
Alexk, хотелось бы услышать более развернутый ответ на счет многопоточности и Ajax’а.
Может статейку напишешь? Или где почитать можно про это…
Самое обсуждаемое на блогах:
"Цветная революция" в Молдавии
Песах
Международный день цыган
Использую курл, стрим-функции, сокеты, форк. Про все это подробно рассказано здесь http://job-interview.ru/articles/post/62 Есть еще расширение для пхп, написанное на С, но с ним не работал, хотя говорят, что потоки там хорошо реализованы.