Выполнение и вывод PHP на веб-сервере на основе C - Stuck! - PullRequest
2 голосов
/ 01 февраля 2010

Я делаю небольшую курсовую работу для университета, и я совершенно сбит с толку. По сути, я создал базовый веб-сервер (который использует сокеты) на C. Теперь мне нужно сделать так, чтобы любой файл .php запускался через компилятор php и выводил.

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

Вот выдержка, показывающая код, который у меня сейчас есть. Пожалуйста, извините за все комментарии ... как вы видите, я пытался всячески заставить его работать!

КОД:

if(strncmp(resource, ".php", 4)==1) {
 //cout << "test";

int php;

  int phppipefds[2], phppid;
  char phpc;
  pipe(phppipefds);
  phppid = fork();
  if(phppid == 0) { // child will read pipe 
 close(0); // close stdin
 dup2(phppipefds[0],0); // read pipe on stdin
 close(phppipefds[1]); // we dont need to write pipe
 execlp("/Applications/MAMP/bin/php5/bin/php", "php", httppath, NULL); 
 cerr << "exec failed\n"; 
 exit(1);
}
// parent, if we redirect stdout printf will send down pipe 
close(1); 
dup2(phppipefds[1],1); // write pipe on stdout
close(phppipefds[1]); // dont need 2 write descriptors
close(phppipefds[0]); // we dont need to read pipe
cout << "words \ngoing \ndown \npipe \nbeing \nsorted\n"; 
close(1); // must close pipe or sort will hang
wait(0);

//php = system("/Applications/MAMP/bin/php5/bin/php /Users/rickymills/webserver/pages/test.php");
//strcat(resp, );
//strcat(resp, php);
 }

В последних нескольких строках я пытался всячески заставить эту штуку работать.

Фактическая часть, где все выгружается в окна браузера, находится чуть ниже приведенного выше кода:

 write(connsock, resp, rd);
 exit(1);
} 

Кто-нибудь знает, как я могу получить это в окне браузера? Я бы подумал, что лучшим способом было бы получить вывод php в переменную и объединить его с 'resp' перед записью connsock, это правильно?

Спасибо за ваше время.

1 Ответ

1 голос
/ 02 февраля 2010

Попробуйте использовать popen () вместо system () или execlp ().

Функция popen () открывает процесс путем создания канала, разветвления и вызова оболочки. Это должно позволить вам перенаправить вывод PHP обратно в вашу программу, а не в терминал.

char buf[BUFSIZ];
FILE *fp;

if ((fp= popen("/bin/php -f /webserver/pages/test.php", "r")) != NULL)
{
    /* Read from the PHP command output */ 
    while (fgets(buf, BUFSIZ, fp) != NULL)
    {
        /* Process the output from PHP as desired */
        ...
    } 

    (void) pclose(ptr);
}

fclose(fp);
...