Исторически сложилось, что скрипты на PHP запускаются при каждом HTTP-запросе. Запускаясь, скрипт проводит какую-то инициализацию (например, устанавливает соединение с СУБД), после чего анализирует запрос и формирует ответ. Однако, всем прекрасно известно, что в мире Python и Ruby принят другой подход: веб-приложения на этих языках загружаются в память единовременно вместе с веб-сервером (или сервером приложений). Взаимодействие сервера приложений со скриптом осуществляется при помощи стандартных интерфейсов WSGI и Rack. Такой подход, безусловно, не лишён недостатков, главный из которых, пожалуй, связан с резким ростом накладных расходов при размещении большого числа сайтов на одном сервере, однако, обладает и важным преимуществом: инициализация производится лишь однократно, затем скрипт лишь отвечает на входящие HTTP-запросы.
Попытки перенести цикл обработки запросов в тело PHP-сценария уже производились, при этом удавалось добиться значительного роста производительности. Однако, для этого приходилось писать достаточно много кода.
Однако, буквально на днях создатели uWSGI реализовали экспериментальную поддержку интерфейса, схожего с WSGI/Rack, для PHP. Я напомню, что uWSGI — чрезвычайно гибкий и функциональный сервер приложений, поддерживающий практически все существующие на сегодняшний день языки и технологии, который легко может быть использован как альтернатива PHP-FPM. Таким образом, появилась возможность создания веб-приложений, постоянно загруженных в память, куда меньшей кровью.
Интерфейс назван «phpsgi». Плагин, реализующий поддержку этого интерфейса, ещё пока достаточно сыроват, однако, разработчик уже изъявил желание показать его широкой общественности.
Установка плагина при наличии уже настроенного uWSGI предельно проста:
После выполнения такой команды в текущем каталоге появится файл «phpsgi_plugin.so», который достаточно поместить в каталог с остальными плагинами сервера (обычно /usr/lib/uwsgi). После этого можно настроить вассала (виртуальный узел), либо запустить экземпляр uWSGI вручную. Для простоты рассмотрим второй вариант.
Если выполнить такую команду, uWSGI обратится к файлу с именем «app.php», который должен содержать в себе функцию «application». На данный момент, так как плагин является экспериментальным, эти имена жёстко определены в коде. Рассмотрим простейший пример кода на PHP, который можно «скормить» этому плагину.
Этот пример выведет в браузер строку «Hello, world!», в то время как строка «Loading» будет выведена однократно в журнал вассала uWSGI.
Попытки перенести цикл обработки запросов в тело PHP-сценария уже производились, при этом удавалось добиться значительного роста производительности. Однако, для этого приходилось писать достаточно много кода.
Однако, буквально на днях создатели uWSGI реализовали экспериментальную поддержку интерфейса, схожего с WSGI/Rack, для PHP. Я напомню, что uWSGI — чрезвычайно гибкий и функциональный сервер приложений, поддерживающий практически все существующие на сегодняшний день языки и технологии, который легко может быть использован как альтернатива PHP-FPM. Таким образом, появилась возможность создания веб-приложений, постоянно загруженных в память, куда меньшей кровью.
Интерфейс назван «phpsgi». Плагин, реализующий поддержку этого интерфейса, ещё пока достаточно сыроват, однако, разработчик уже изъявил желание показать его широкой общественности.
But i will absolutely ask you for tests/reports and for gathering people willing to try it :)
Установка плагина при наличии уже настроенного uWSGI предельно проста:
uwsgi --build-plugin https://github.com/unbit/uwsgi-phpsgi
После выполнения такой команды в текущем каталоге появится файл «phpsgi_plugin.so», который достаточно поместить в каталог с остальными плагинами сервера (обычно /usr/lib/uwsgi). После этого можно настроить вассала (виртуальный узел), либо запустить экземпляр uWSGI вручную. Для простоты рассмотрим второй вариант.
uwsgi --plugin phpsgi --http-socket :9090
Если выполнить такую команду, uWSGI обратится к файлу с именем «app.php», который должен содержать в себе функцию «application». На данный момент, так как плагин является экспериментальным, эти имена жёстко определены в коде. Рассмотрим простейший пример кода на PHP, который можно «скормить» этому плагину.
<?php
echo 'Loading';
function application($env) {
return ['200 OK', ['Content-Type' => 'text/plain'], 'Hello, world!'];
}
Этот пример выведет в браузер строку «Hello, world!», в то время как строка «Loading» будет выведена однократно в журнал вассала uWSGI.