Какова команда, которую вы пытаетесь выполнить? Из комментариев, которые вы оставили, это похоже на то, что вы пытаетесь выполнить сам PHP? (Вы прошли C:\xampp\php\php.exe
до proc_open()
)
Все, что вы хотели бы сделать в php.exe, можете обойтись без запуска исполняемого файла. Исполняемый файл вызывается Apache при запросе файла .php
с веб-сервера. Таким образом, если вам действительно нужно запустить PHP-код, вы просто его кодируете. Вы бы не сказали PHP загружать PHP-интерпретатор. Это было бы глупо =) Как у английского переводчика английского языка.
Если вы сказали нам конкретно команду, которую вы пытаетесь запустить, тогда мы сможем дать лучшее объяснение того, как ее выполнить. Я знаю один пример из своего собственного опыта, когда мне пришлось использовать proc_open()
для шифрования файлов с помощью GPG.
$descriptors = array(
0 => array("pipe", "r"), // STDIN. Used to feed input
1 => array("pipe", "r"), // STDOUT. We are writing to it, though
2 => array("pipe", "w"), // STDERR. Used to read errors
);
// Build the command line and start the process
$cmd = '"C:/program files/gnu/gnupg/gpg.exe" --batch --no-verbose --passphrase-fd 1 --output decrypted.zip --decrypt encrypted.zip.gpg';
$gpg = proc_open($cmd, $descriptors, $pipes);
if(is_resource($gpg)) {
// Push passphrase to custom pipe
fwrite($pipes[1], $passphrase);
fclose($pipes[1]);
proc_close($gpg);
}
Обратите внимание, что для STDOUT
он говорит: «Мы обращаемся к нему, хотя». Этот код на самом деле был моим решением проблемы в Windows (Vista и XP. Не уверен, что 7 исправил ее). Windows разрешает только 3 трубам общаться с программой из командной строки, в отличие от UNIX, которая позволяет создавать МНОГИЕ больше (я думаю, 256 или что-то еще). GPG обычно требует работы четырех труб. Один для входных данных (данные должны быть зашифрованы/дешифрованы), один для выходных данных, один для ошибок и один канал для пароля.
Поскольку я расшифровывал файл, мне не нужно было видеть выходные данные программы, мне нужно было только увидеть, были ли ошибки. Никакие ошибки не означают, что вывод можно найти в файле. Таким образом, я проигнорировал выходной канал и использовал его для отправки пароля. В зависимости от вашего использования вам может не понадобиться такое сложное решение.
Это, безусловно, похоже на способ сделать это, но я все еще пытаюсь заставить пример работать и вернусь к вам. Файл ошибки содержит «php» не распознается как внутренняя или внешняя команда, операционная программа или командный файл ». но php.exe * IS * в моей системе Windows PATH. – Mawg 2010-11-29 02:41:04