C ++ для запуска PHP - PullRequest
       21

C ++ для запуска PHP

1 голос
/ 25 октября 2011

Я использую popenRWE из http://www.jukie.net/bart/blog/popenRWE и создаю сценарий ниже

int pipes[3];
int pid;
const char *const args[] = {
    "php ",
    NULL
};
pid = popenRWE(pipes, args[0], args); 

char *cmd = "<?php echo 'hello world';?> ";
cout << "write: " << write(pipes[0], cmd, strlen(cmd)) << endl;
cout << "err: " << errno << endl;

char res[100];
cout << "read: " << read(pipes[1], res, 100) << endl;
cout << "result: " << res << endl;

, когда я использую команду cat, она работает, ввод - это вывод (это то, что делает cat), но при использовании php чтение пусто.я подтвердил, что php установлен и на моем пути, запустив

echo "<?php echo 'hello world';?>" | php

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

1 Ответ

1 голос
/ 25 октября 2011

Есть три проблемы с вашим кодом:

  • Не существует исполняемого файла с именем "php ".Там просто "php" (обратите внимание, что места нет).Причина, по которой это не работает, заключается в том, что popenRWE использует execvp, который не запускает оболочку для выполнения команды, но ожидает имя файла исполняемого файла, который вы хотите выполнить (он ищет его в$PATH хотя).
  • Вы должны close stdin -файл обработки после того, как вы записали свои данные, в противном случае вам, возможно, придется ждать бесконечно долго для записи вывода.
  • Также вам следует подождать, пока php -процесс завершит использование waitpid, потому что в противном случае вы можете «потерять» некоторые выходные данные.

Чтобы обернуть его:

int pipes[3];
int pid;
const char *const args[] = {
    "php",
    NULL
};
pid = popenRWE(pipes, args[0], args);

char *cmd = "<?php echo 'hello world', \"\\n\";?> ";
cout << "write: " << write(pipes[0], cmd, strlen(cmd)) << endl;
cout << "err: " << errno << endl;
close(pipes[0]);

// TODO: proper error handling
int status;
waitpid(pid, &status, 0);

char res[100];
int bytesRead = read(pipes[1], res, (sizeof(res)/sizeof(char))-1);
// zero terminate the string
res[bytesRead >= 0 ? bytesRead : 0] = '\0';

cout << "read: " << bytesRead << endl;
cout << "result: " << res << endl;
...