Создание скелеты, PHP-поддерживающий веб-сервер в C?

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

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

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

Я все еще довольно плохо знаком с C и C++, и это - полезный опыт.

6
задан THelper 3 May 2012 в 11:44
поделиться

3 ответа

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

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

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

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

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

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

Выйдите за рамки этого, и вы увидите обработку асинхронных сокетов, которая находится на довольно низком уровне.

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

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

10
ответ дан 8 December 2019 в 17:18
поделиться

Чтобы получить опыт работы с кодом HTTP, написанным на C, вы также можете взглянуть на:

http://hping.org/wbox/

2
ответ дан 8 December 2019 в 17:18
поделиться

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

Посмотрите его библиотеку 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
ответ дан 8 December 2019 в 17:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: