В настоящее время я работаю над веб-платформой 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 ...
есть ли альтернатива?