Многопоточность в PHP - PullRequest
       26

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

6 голосов
/ 26 февраля 2009

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

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

Все это должно работать в веб-приложении, написанном на Zend Framework

Ответы [ 6 ]

7 голосов
/ 26 февраля 2009

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

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

4 голосов
/ 26 февраля 2009

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

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

2 голосов
/ 03 июля 2009

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

2 голосов
/ 26 февраля 2009

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

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

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

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

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

2 голосов
/ 26 февраля 2009

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

1 голос
/ 14 октября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...