2011/03/05

Сервер на ПХП

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

Однажды мне понадобился быстрый сервер-преобразователь, только не спрашивайте для чего, что-то вроде фильтрующего прокси: принял один контент - выдал другой. Я уже начал присматриваться к mod_proxy и mod_filter апача, но большие мощные штуки тем и хороши, что они большие мощные штуки. Здесь затраты не стоят результата.
Поискал маленькие сервера... Но в самом деле, не вешать же ещё один веб-сервер, когда есть апач?

И идея вернулась на круги своя: сделать сервер на самом php - сокеты есть в каждой операционке. По сокетам вполне внятный ман с несколькими примерами эхо-серверов. Но в задаче требуется не эхо-сервер, а обработчик контента, в задаче-максимум - с запуском внешних утилит.
Следующим этапом гугления был гайд от http://i-novice.net/sokety-v-php/, но и там эхо, хотя уже расширенный. Кстати, рекомендую закинуть сайт в закладки: интересно, доступно и практично.
Сервер из примера я и взял за основу для работы. Программирование "от ошибок" показало, что:
  • необходимо помнить и правильно указывать параметры при socket_create - типы сокетов, и socket_bind - действительно свободный порт;
  • вложенные циклы выбраны не просто так, а socket_accept выполняет очень важную миссию как бы клонирования ресурса сокета.
Результаты смотрим в известном месте. (upd: просто сложил все примеры кучей)

Несомненно порадовал свежак веб-сервера встроенного в пхп http://wiki.php.net/rfc/builtinwebserver ;) Но это для тех, кому не лень ещё раз скомпилить ядро. Также в процессе работы не раз всплыл нановеб с известного казахского сайта. Но сто строк своего родного велосипеда выглядят гораздо приятней против 43кб его исходников.

Как можно использовать это чудо природы пока без названия?
По прямому назначению после допиливания конфигов и массивов заголовков: как веб-сервер. Может быть также полезен работникам клиент-сайда для проверки аяксов, как фейковый сервер при падении основного, ибо для работы требует только php-cli.
Как MyNoSQL сервер - прокси между клиентским аяксом и MySQL базой - есть такая модная тенденция.
Как PostNoSQL сервер - через PL\PHP из прошлых постов я запущу его прямо в постгре и получу прямой доступ к XML-хранилищу.

На сегодня всё.
Оставайтесь с нами

ps: поделюсь демотиватором на прощанье: http://habrahabr.ru/blogs/lisp/114981/
и хитрые задачи по SQL http://www.xt-r.com/2011/03/1.html