Параллельное выполнение в apache / mod_php? - PullRequest
1 голос
/ 17 октября 2010

В настоящее время я работаю над веб-платформой MVC с особой функцией. Макеты, определенные в файлах XML, разделяются на блоки содержимого, которые можно упорядочивать / кэшировать / загружать по отдельности.

Каждый блок содержимого (это может быть, например, нижний колонтитул, который повторно используется на нескольких страницах) имеет своего рода собственный контроллер. Я называю это Blockcontroller.

Этот контроллер выполняет соответствующий код (включая запросы БД через модели ресурсов, запросы внешних API через модель клиента HTTP и т. Д.).

Каркас предназначен для использования в очень сложных средах, где задействованы несколько источников данных. Особенно это будет несколько серверов баз данных и REST apis.

Теперь цель состоит в том, чтобы выполнять такие блоки контента одновременно, чтобы ускорить доставку страницы.

Пример:

Веб-интерфейс должен получить вашу адресную книгу из Google Mail, Facebook, Twitter и 10 других источников, выполнить некоторые сопоставления и вычисления. Каждый запрос занимает около 1 секунды. Это добавляет до 15 секунд, если выполняется последовательно.

Цель состоит в том, чтобы определить блок для всего (да, это, скорее, следует перейти к модели, но я хочу сохранить его на уровне блоков, так как большая часть логики определена в этих XML-файлах. .) и установите флаг «одновременное выполнение» на 1.

Последний блок содержимого, который собирает все эти параллельные блоки в качестве обязательного атрибута, поэтому он начинает выполняться, когда все они сделаны и данные доступны. Примерно так:

<block template="blank.phtml" block="twitter.php" concurrent="1" name="twitter"/>
<block template="blank.phtml" block="gmail.php" concurrent="1" name="gmail"/>
<block template="blank.phtml" block="facebook.php" concurrent="1" name="facebook"/>
<block template="stats.phtml" block="statistics.php">
    <depends>twitter</depends>
    <depends>gmail</depends>
    <depends>facebook</depends>
</block>

Синтаксический анализатор, в основном, просматривает сначала поля xml макета и сканирует блоки, помеченные для одновременного выполнения, и собирает массив с очередью, и каждая точка очереди может иметь несколько записей. они находятся в порядке зависимости.

Так что, если что-то не имеет зависимости, оно определенно попадает в группу очередей в самой первой позиции. Все, что зависит от этой группы, уходит во второе положение и так далее ...

Данные сохраняются в одноэлементной модели.

Моя проблема сейчас в том, что он отлично работает с mod_cgi или mod_fastcgi для php, но он просто портит apache mod_php.

Я немного погуглил и прочитал, что вы никогда не должны использовать pcntl_fork с mod_php ... есть ли альтернатива?

1 Ответ

2 голосов
/ 17 октября 2010

Вместо разветвления используйте proc_open для запуска каждого блока в виде различных сценариев в командной строке.Это возможно не на всех веб-хостах, но, возможно, у вас есть собственный сервер?

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

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