Я почти закончил писать HTTP/1.0 совместимый веб-сервер под Java (никакое коммерческое использование как таковое, это только для забавы), и в основном я хочу включать поддержку PHP. Я понимаю, что это не легкая задача вообще, но я думаю, что это будет хорошее выполнение.
Таким образом, я хочу знать, как PHP точно взаимодействует через интерфейс с веб-сервером Apache (или любой другой веб-сервер действительно), таким образом, я могу извлечь уроки из него и записать свою собственную обертку PHP. Это должен не обязательно быть mod_php, я не возражаю писать обертку FastCGI - чтобы к моему знанию способно к выполнению PHP также.
Я думал бы, что все, в чем нуждается PHP, является выводом, который переходит к клиенту (таким образом, он может интерпретировать части PHP), полный Запрос HTTP от клиента (таким образом, он может извлечь переменные POST и такой), и имя хоста клиента. И затем Вы просто берете проанализированный код PHP и пишете это в поток вывода. Вероятно, будет больше вещей, но в сущности это - то, как я думал бы, что это работает.
Из того, что я собрался до сих пор, apache2handler обеспечивает API, который PHP использует для 'соединений' с Apache. Я предполагаю, что это - идея посмотреть на исходный код для apache2handler и php5apache2.dll или так, но прежде чем я сделаю это, я думал, что спрошу ТАКИМ ОБРАЗОМ сначала.
Если у кого-либо есть больше информации, опыта или своего рода спецификация, которая относится к этому затем сообщенному мне.
Заранее спасибо!
Существует 3 способа вызова 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-соединению.
Ключевое слово - CGI
.
Это чрезвычайно простой протокол, который долгое время обслуживает веб-серверы.
Это не единственный способ взаимодействия PHP с веб-сервером, но наиболее распространенный и простой в реализации.
Короче говоря, ваш сервер должен установить некоторые переменные среды, а затем вызвать cgi-скрипт, который сам является просто скриптом php.
Помимо php-файла, HTTP-запроса и имени хоста клиента, есть и другие элементы информации, обычно передаваемые PHP для установки некоторых других элементов суперглобального параметра $_SERVER
. На странице документации по ссылке есть список того, что обычно задается.