Делаете скелет, веб-сервер с поддержкой PHP на C? - PullRequest
6 голосов
/ 19 июня 2010

Я хочу сделать максимально легкий HTTP-сервер в C, который поддерживает PHP и, возможно, FastCGI, если это будет иметь огромное значение.

Я не уверен, как реализовать поддержку PHP.Он просто вызывает PHP.exe с путем к файлу .php и читает вывод?Как насчет таких вещей, как header () в PHP?Как они обрабатываются сервером?

И еще вопрос, идеально ли использовать отдельные потоки для каждого запроса?Я не ожидаю очень большой нагрузки, но я не уверен на 100% в аспекте дизайна этого ...

Я все еще довольно новичок в C и C ++, и это опыт обучения.

Ответы [ 4 ]

10 голосов
/ 19 июня 2010

Во-первых, позвольте мне сказать, что если целью является облегченный HTTP-сервер, который обслуживает страницы PHP, это уже сделано. Посмотрите на nginx .

Что касается опыта обучения, вы выбрали что-то действительно сложное.

Многопоточность трудна в лучшие времена. На C / C ++ (что-нибудь с ручным выделением памяти) это на порядок сложнее.

К этому добавлено сетевое общение. Существуют причуды, с которыми приходится сталкиваться, различные версии HTTP (в основном это не проблема), всевозможные заголовки HTTP и т. Д.

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

Это, однако, не масштабируется. Первая (очевидная) оптимизация заключается в использовании потоков вместо процессов и некоторой формы межпотокового взаимодействия. Хотя это помогает, оно пока только масштабируется.

Пройдите дальше и посмотрите на обработку асинхронных сокетов, которая является довольно низким уровнем.

Все это, однако, довольно большие проекты.

Есть ли какая-то особая причина, по которой вы делаете это в C / C ++? Или по какой-то конкретной причине вы изучаете один или оба этих языка? Эти языки, безусловно, имеют свое место, но они все больше становятся нишевыми языками. Управляемые (сборка мусора) языки / платформы почти полностью освоены. Джоэл утверждает, что сборщик мусора - это единственное огромное увеличение производительности в программировании за последние 20 лет, и я склонен согласиться.

2 голосов
/ 27 июня 2010

Чтобы создать свой собственный HTTP-сервер, я рекомендую черпать вдохновение из кода других людей. Программист ry , известный своей структурой node.js, написал простой элегантный код по этому вопросу.

Посмотрите его библиотеку libebb , в ней есть парсер , сгенерированный с помощью Raegel с использованием простого, но мощного PEG (основан Парсер Зеда Шоу). Также проверьте пример использования . Это действительно чистый и удобный код.

libebb is a lightweight HTTP server library for C. 
It lays the foundation for writing a web server 
by providing the socket juggling and request parsing. 
By implementing the HTTP/1.1 grammar provided 
in RFC2612, libebb understands most most valid HTTP/1.1 
connections (persistent, pipelined, and 
chunked requests included) and rejects invalid or 
malicious requests. libebb supports SSL over HTTP. 

Что касается связывания PHP-сервера, самый простой способ - это CGI , но если вы испытываете желание покопаться в исходном коде php в модулях SAPI (Server API), чтобы узнать, как это сделать.

2 голосов
/ 19 июня 2010

Для ознакомления с HTTP-кодом, написанным на C, вы также можете посмотреть:

0 голосов
/ 15 марта 2012

Аналогично libebb, см. http://www.gnu.org/software/libmicrohttpd/. Он также использует GnuTLS для дополнительного SSL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...