Назад | Перейти на главную страницу

php-серверы без стека apache / nginx / cgi

На многих языках вы создаете веб-фреймворки с нуля (то есть из сокетов unix) и накладываете слои на абстракции. Если я хочу создать веб-фреймворк с нуля на OCaml или C, я сначала создаю сервер сокетов, который прослушивает порт 80.

Мне только что пришло в голову, что PHP, как и любой другой язык более высокого уровня, вероятно, каким-то образом обертывает сокеты unix. Теперь я знаю, что PHP никогда не создавался таким образом. Однако я не понимаю, почему он никогда не использовался таким образом. В том же духе интерпретатор PHP никогда не используется таким образом, как интерпретатор Python.

Например, когда я создаю веб-сервер Python с нуля и развертываю его, я делаю следующее: подключаю сокет unix к некоторому порту (скажем, 8000), демонизирую свой скрипт, например python server.py 8000и имеет обратный прокси-сервер nginx на порту 80 и перенаправляет его на мой внутренний локальный сервер на порт 8000. Я НИКОГДА не видел этого в PHP, хотя это возможно.

Я признаю, что у вас есть и другие варианты в Python, кроме использования автономного интерпретатора (например, tornado, uwsgi и т. Д.). Однако это делается в обоих направлениях.

Мой вопрос в том, каковы аспекты PHP, языка, интерпретатора или сообщества, которые препятствуют созданию веб-фреймворков PHP с нуля из вызовов сокетов unix, демонизации на локальном порту и обратному проксированию вместо использования cgi / обертка fastcgi?

Одним словом, история. Это очень краткое изложение более чем 15-летней истории (вы можете узнать больше в Интернете, если вам действительно интересно):

Во-первых, хотя PHP обладает всеми функциями языка программирования, это не всегда так. Это началось как «препроцессор гипертекста», предназначенный для встраивания в HTML-страницы и анализа программой CGI или самим веб-сервером. Это должно было быть запущено по существующий веб-сервер, а не быть веб-сервер. В своих ранних версиях это был очень простой язык (и некоторые сказали бы, что он до сих пор).

PHP восходит к концу 1990-х годов, и тогда единственный способ для веб-сервера запускать динамический контент был через CGI. Однако большая проблема CGI заключалась в том, что он был довольно медленным, потому что создавал новый процесс для каждого запроса. Вначале это не было большой проблемой, но когда разразился бум доткомов, это стало проблемой. PHP стал настолько популярным, что встроенный в Apache в качестве загружаемого модуля, который обеспечивает лучшую производительность, чем CGI, и предлагает некоторые другие преимущества.

Долгое время PHP можно было запускать только одним из этих двух способов, но, поскольку он стал языком с подавляющей долей рынка, никого это особо не волновало. Хотя в конце концов некоторые люди захотели использовать серверы, отличные от Apache, и какое-то время CGI был единственным способом сделать это, пока FastCGI серверный API, известный как php-fpm (FastCGI Process Manager) в конечном итоге был добавлен в PHP. В отличие от CGI, FastCGI поддерживает постоянно работающий пул процессов, готовый обслуживать входящие запросы.

В 2000-х появились другие языки, которые работают по-другому. Например, в Ruby библиотеки приложений поставляются в виде так называемых драгоценных камней, и программу можно легко создать, просто склеив некоторые существующие жемчужины с бизнес-логикой. Rack - это драгоценный камень Ruby, который предоставляет Ruby API для создания веб-серверов, а серверы, такие как mongrel, unicorn, thin и т. Д., А также такие фреймворки, как Rails и Sinatra, построены на его основе.

Другие языки, такие как Python и Java, имеют аналогичные веб-серверы и структуры веб-серверов. Как видите, это совершенно иной подход, чем в PHP, который вообще не использует HTTP для обслуживания запросов.

Однако в последних версиях PHP теперь есть "встроенный веб-сервер", но это относительно новый и может обрабатывать только одно соединение за раз, что делает его непригодным для производственного использования. Он явно предназначен для использования разработчиками.

В конечном итоге все сводится к следующему: PHP был разработан для работы в контексте существующего документа HTML, тогда как другие языки, такие как Python, Ruby, Java и т. Д., Являются универсальными. Единственный известный мне веб-язык, который в этом отношении работает как PHP, - это «Классический» ASP от Microsoft, имеющий похожий дизайн.

Ничего. Вы можете использовать любой язык для прослушивания любого порта и ответа в соответствии с правилами протокола (в данном случае HTTP). Нет ничего, что говорило бы, что это невозможно с PHP. Вы можете привязать его к сокетам или просто читать и писать в STDIN, STDOUT и быть запущенным из xinet, или даже работать с другим приложением, например apache или nginx которые знают немного больше о HTTP чем большинство людей хотят реализовать самостоятельно.