2015-03-10 2 views
0

Прежде всего, я знаю, для создания веб-серверов, которые занимаются статическими страницами html.Как создать веб-сервер в C, который поддерживает PHP-страницы?

Я хочу создать веб-сервер , который поддерживает страницы PHP.

Я закодирован сервер, как показано ниже, -> main() функция просто создать сокет, принимает запрос и вызывает функцию соединения (FD).

int main(int argc, char *argv[]) { 
    int sockfd, newsockfd, portno, pid; 
    socklen_t clilen; 
    struct sockaddr_in serv_addr, cli_addr; 

    if (argc < 2) { 
      fprintf(stderr, "ERROR, no port provided\n"); 
      exit(1); 
    } 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
     error("ERROR opening socket"); 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    portno = atoi(argv[1]); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(portno); 
    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 
     error("ERROR on binding"); 
    listen(sockfd, 5); 
    clilen = sizeof(cli_addr); 
    /* 
     Server runs forever, forking off a separate 
     process for each connection. 
     */ 
    while (1) { 
      newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); 
      if (newsockfd < 0) 
      error("ERROR on accept"); 
      pid = fork(); 

      if (pid < 0) 
       error("ERROR on fork"); 
      if (pid == 0) { 
       close(sockfd); 
       connection(newsockfd); 
       exit(0); 
      } else 
      close(newsockfd); 
    } /* end of while */ 
    close(sockfd); 
    return 0; /* we never get here */ 
} 

-> connection() функция корневая множества документов и явно устанавливает PHP-страницу (echo.php) и вызывает функцию PHP-CGI(). php-cgi() выполняет дальнейший процесс.

На самом деле я не знаю, что делает php5-cgi. Когда я запускать сервер и запросить страницу с веб-браузера, он показывает «Am РНР файл» в течение 1 секунды, и шкурами, отображает сообщение,

Соединение сброшено

1) Каков правильный способ обработки страниц php на веб-сервере

2) Может ли кто-нибудь предложить мне какие-нибудь книги или что-нибудь еще, чтобы создать веб-сервер в C, который обрабатывает страницы PHP?

3) Я хочу попробовать любой другой язык? который является наиболее предпочтительным языком для создания веб-сервера и прокси?

4) как обращаться со строками запроса и запросами метода POST?

, когда я сделал телнет к серверу он работает,

GET /echo.php HTTP/1.1 
HTTP/1.1 200 OK 
X-Powered-By: PHP/5.5.9-1ubuntu4.6 
Content-type: text/html 

<html> 
<body> 
Am a PHP file 
</body> 
</html> 
+0

php имеет встроенный веб-сервер. для запуска простого веб-сервера вы можете запустить эту команду из командной строки 'php -S localhost: 80' – bekt

+0

, но КАК Я могу создать веб-сервер, такой как apache? не нужно много безопасности, но он должен выполнять PHP-скрипты. как я могу это достичь? – samanta

ответ

0

Вы отсутствуют некоторые поля заголовка HTTP. Одна из проблем заключается в том, что браузер не знает, сколько данных ожидать; поэтому, пока он получает и анализирует данные, соединение закрывается, потому что ваш PHP-скрипт заканчивается, и браузер переходит к «Huh?».

Итак, вы должны отправить либо заголовок Content-length (если вы знаете длину своего тела заранее), либо поле Transfer-encoding (см. http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2). Первое решение добавляет еще одну проблему: вы должны определить длину перед отправкой заголовков. Это означало бы захват всего вывода в буфере, подсчет байтов, а затем отправку заголовков (ов), за которыми следует содержимое. Но это добавит еще один fork() в ваш код ... Я попытался добавить заголовок вроде Transfer-Encoding: identity, но это не сработало. Возможно, вы захотите добавить заголовок Connection: close.

Другие ваши вопросы немного шире; не имеет значения, какой язык вы используете, вам придется выполнить всю сложную работу по разбору заголовков HTTP-запросов, сборке заголовков, форвок, параметров синтаксического анализа и т. д. Ваш подход с fork(), execl() теоретически звучит, но требует намного больше работы. Так что, используя Apache, nginx или любой другой веб-сервер, кажется соблазнительным использовать ...

+0

спасибо. но теперь я хочу знать. Как скрипты PHP выполняются на сервере. Это так же, как я использовал скрипт ph5-cgi. где я могу найти документацию для ее реализации? – samanta

+0

, когда я запускаю дочерний процесс, используя execl («/ usr/bin/php5-cgi», «php5-cgi», NULL); он напрямую разговаривает с браузером с двумя заголовками: - X-Powered-By: PHP/5.5.9-1ubuntu4.6 Content-Type: text/html. Он не отправляет последние «\ r \ n \ r \ n», чтобы отделить заголовки от тела объекта. Я прав? Как я могу добавить это. Я думаю, что я рядом, ты можешь мне помочь. – samanta

+0

, когда я сделал telnet на сервере, я получил рабочий результат, GET /echo.php HTTP/1.1 HTTP/1.1 200 OK X-Powered-By: PHP/5.5.9-1ubuntu4.6 Тип контента: текст/html является файл PHP – samanta

Смежные вопросы