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

Недавно я прочитал о http://php.net/pcntl и искал, насколько хороши эти функции, и если было бы разумно использовать многопоточность в PHP, поскольку это не основная функция PHP.

Я хотел бы запускать события, которые не требуют обратной связи через него, как ручное выполнение cronjob.

Все это предполагается запустить в веб-приложении, написанном с помощью Zend Framework

Пакет pcntl работает очень хорошо – он просто использует соответствующие функции unix . Единственный недостаток заключается в том, что вы не можете использовать их, если php вызывается из контекста веб-сервера. т.е. вы можете использовать его в сценариях оболочки, но не на веб-страницах – по крайней мере, не используя хак, как вызов скрипта forking с exec или аналогичным.

[edit] Я только что нашел страницу, объясняющую, почему mod_php не может разблокировать . В основном это проблема безопасности. [/редактировать]

Это не управление потоками, это управление процессом. Библиотека для потоков – pthreads (потоки POSIX), и она не включена в PHP, поэтому в PHP нет многопоточных функций.

Что касается многопроцессорности, вы не можете использовать это в mod_php, так как это будет гигантская дыра в безопасности (у порожденного процесса будут все привилегии веб-сервера).

Единственный возможный способ выполнения PHP-кода в нескольких потоках – запустить php в качестве модуля потокового веб-сервера, что бесполезно, потому что потоки полностью изолированы, а ваш код не контролирует их. Насколько я знаю, pcntl управляет процессами, а не потоками.

Если мне нужно было выполнить ручные crontab-исполнения или что-то подобное с PHP, я бы, вероятно, использовал очередь. Укажите таблицу базы данных, к которой вы добавляете задания. Другой процесс, либо из cron, либо работает как демон, выполняет задания по мере их появления.

Другой способ сделать это – создать отдельный скрипт и выполнить HTTP GET. Это не очень многопоточность, но это один из способов обхода другой команды в PHP.

Например, если я /usr/bin/somescript.sh запустить /usr/bin/somescript.sh по запросу, у меня будет somescript.php который сделал системный вызов. Это было бы на виртуальном хосте, доступном только из localhost.

Я бы сделал вызов сокета на веб-сервер и ПОЛУЧИТЬ скрипт. Ключ должен не читать на сокете, чтобы он не блокировался. Если бы я хотел проверить возвращаемое значение somescript.php , я бы сделал это позже в моем основном скрипте, чтобы предотвратить блокировку.

Если somescript.php требует много времени для выполнения (дольше, чем вызывающий скрипт), вам нужно будет сделать некоторую магию, чтобы остановить apache от убийства скрипта при закрытии сокета.

Многоплатформенный многопоточный движок PHP http://anton.vedeshin.com/articles/lightweight-and-multiplatform-php-multithreading-engine

Примеры многопоточности, работающие в PHP (с выдержками из их страниц проекта):

  • Cron Multi-Threaded .

По состоянию на 25 октября 2011 года этот модуль достиг «конца жизни» и устарел в пользу таких проектов, как Elysia Cron . Этот модуль не был совершенно бесполезен в том, что основной патч, вдохновленный Cron MT, был посвящен D7.

  • Boost .

… обеспечивает статическое кэширование страниц для Drupal, что позволяет значительно повысить производительность и масштабируемость сайтов, которые получают в основном анонимный трафик. Для общего хостинга это ваш лучший вариант с точки зрения повышения производительности. На выделенных серверах вы можете вместо этого рассмотреть Лак.