Я почти закончил писать HTTP / 1.0-совместимый веб-сервер под Java (никакого коммерческого использования как такового, это просто для удовольствия), и в основном я хочу включить поддержку PHP. Я понимаю, что это совсем непростая задача, но я думаю, что это будет приятное достижение.
Поэтому я хочу знать, как PHP точно взаимодействует с веб-сервером Apache (или любым другим веб-сервером на самом деле), поэтому я могу извлечь уроки из него и написать свою собственную PHP-оболочку. Это не обязательно должно быть mod_php, я не против писать обертку FastCGI, которая, насколько мне известно, также способна работать с PHP.
Я бы подумал, что все, что нужно PHP, – это вывод, который поступает на клиентский компьютер (чтобы он мог интерпретировать части PHP), полный HTTP-запрос от клиента (чтобы он мог извлекать переменные POST и т. Д.) И имя хоста клиента. И тогда вы просто берете проанализированный PHP-код и записываете его в выходной поток. Вероятно, будет больше вещей, но в сущности я так думал, что это работает.
Из того, что я собрал до сих пор, apache2handler предоставляет API, который PHP использует для подключения к Apache. Я предполагаю, что это идея взглянуть на исходный код для apache2handler и php5apache2.dll или так, но прежде чем я это сделаю, я подумал, что сначала спрошу SO.
Если у кого-то есть больше информации, опыта или какой-то спецификации, которая имеет отношение к этому, пожалуйста, дайте мне знать.
Заранее спасибо!
Существует три способа, с помощью которых PHP можно вызывать из Apache:
1) в качестве модуля – это связано с связыванием php-интерпретатора с библиотекой перехватов, опубликованной веб-сервером
2) CGI – веб-сервер запускает экземпляр интерпретатора для каждого запроса и передает параметры интерпретатору через stdin, командную строку и переменные среды, stdout отправляется клиенту, а stderr следует записывать в error_log
3) fastCGI – это устраняет накладные расходы при запуске нового процесса для каждого запроса – интерпретатор работает как демон
CGI является самым простым в реализации, но не масштабируется / работает хорошо, модуль будет самым сложным на сегодняшний день. FastCGI почти так же быстро, как и модульный подход. CGI и fastCGI – это открытые, хорошо документированные API.
Существуют и другие способы достижения вашей цели – например, Quercus
C.
Проще говоря, вот как это работает:
Apache обычно обслуживает файлы, загружая файл и отправляя поток по HTTP-соединению. С PHP, однако, Apache извлекает файл, передает его в двоичный файл PHP и отправляет выходной поток из команды вниз по HTTP-соединению.
В дополнение к файлу php, HTTP-запросу и имени хоста клиента есть некоторые другие элементы информации, которые обычно передаются PHP для установки некоторых других элементов $_SERVER
. На связанной странице документации есть список того, что обычно задается.
Ключевым словом является CGI
.
Это очень простой протокол, который обслуживает веб-серверы целую вечность.
Это не единственный способ взаимодействия PHP с веб-сервером, но наиболее распространенный и простой в реализации.
Короче говоря, ваш сервер должен настроить некоторые переменные среды, а затем вызвать cgi-скрипт, который является только скриптом php.