Pull to refresh

WSGI/Rack для PHP

Reading time 2 min
Views 13K
Исторически сложилось, что скрипты на PHP запускаются при каждом HTTP-запросе. Запускаясь, скрипт проводит какую-то инициализацию (например, устанавливает соединение с СУБД), после чего анализирует запрос и формирует ответ. Однако, всем прекрасно известно, что в мире Python и Ruby принят другой подход: веб-приложения на этих языках загружаются в память единовременно вместе с веб-сервером (или сервером приложений). Взаимодействие сервера приложений со скриптом осуществляется при помощи стандартных интерфейсов WSGI и Rack. Такой подход, безусловно, не лишён недостатков, главный из которых, пожалуй, связан с резким ростом накладных расходов при размещении большого числа сайтов на одном сервере, однако, обладает и важным преимуществом: инициализация производится лишь однократно, затем скрипт лишь отвечает на входящие HTTP-запросы.

Попытки перенести цикл обработки запросов в тело 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.
Tags:
Hubs:
+26
Comments 25
Comments Comments 25

Articles