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


При написании скриптов-парсеров все рано или поздно приходят к вопросу о многопоточной реализации оных.

Я не стал исключением и изучил довольно много информации по данному вопросу и пришел к выводу — нужно реализовывать на неблокируемых сокетах (мультикурл мне не понравился тем, что он может обрабатывать только пачками, т.е. при обработке 100 урлов на конечном этапе имеем снижение производительности — допустим 98 уже обработалось и вся система ждет обработку каких то 2х тормозных урлов, в конечном итоге теряя время).

Плотно пошарив в инете нашёл таки класс AunoAsyncHttp, на котором в дальнейшем я и выстраивал все свои многопоточные скрипты.

Кому интересны дебаты на счёт многопоточности вот пару интересных тем с умакс-форума:

На всякий случай выложу его на своем хостинге (а то мало ли) — AunoAsyncHttp

На этом всё — enjoy.

И ещё — PHP программистам: очень хотелось бы почитать в комментах ваше мнение о данном классе! Какую реализацию многопоточности в PHP используете Вы ?


9 комментариев на «“Многопоточность в PHP”»

  1. ну не многопоточность а асинхронные неблокируемые, зачем придумывать…

    а вообще я раньше смотрел на сокет селект, но после прочтения -A d u l t-а стало ясно что проще и надежнее через циклы с проверками на сосотояния и ошибками

    а вообще класс так и построен почти — как мне показалось на первый взгляд — не полная обработка ошибок — но если все работает всегда без сбоев — то я наверное ошибся

  2. Для чего нужна многопоточность? Если для загрузки чего либо из интернета, то тут основная проблема в том, что соединение может зависнуть
    в любом самом неожиданном месте, например при резолве хоста. То есть загнётся и мультикурл и этот класс и любой другой способ, в котором
    ВСЕ операции, влючая резолв не разнесены по разным потокам. То есть для устойчивой многопоточности, надо гарантировать, что ни один поток
    не заткнётся или заткнувшись не остановит все остальные. Я делаю так — открываю много соединений сам с собой, просто дёргаю тот же скрипт
    с нужными параметрами, а этот скрипт видя что его об этом просят — скачивает требуемые урлы и отдаёт их главному потоку. Шансов что сервер
    сам до себя не сможет достучаться немного, а если зависнет какой-то из вспомогательных потоков — это не так страшно. 🙂 Этот подход работат
    почти на любых хостингах, но за универсальность приходится платить — способ ресурсоёмкий. Если можно запускать консольные команды, то можно
    модифицировать способ — вместо того чтобы открывать соединение сам с собой, запустить кучу пхп процессов. Правда не знаю что будет, если
    часть процессов будет зависать, очистит ли их линукс автоматически или они тыщами будут сидеть в памяти.

  3. к проблеме многопоточности я подошёл с другой стороны — использовал AJAX и асинхронные запросы.

  4. Alexk, хотелось бы услышать более развернутый ответ на счет многопоточности и Ajax’а.
    Может статейку напишешь? Или где почитать можно про это…

  5. Использую курл, стрим-функции, сокеты, форк. Про все это подробно рассказано здесь http://job-interview.ru/articles/post/62 Есть еще расширение для пхп, написанное на С, но с ним не работал, хотя говорят, что потоки там хорошо реализованы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *