2010-11-29 5 views
0

Я хочу выполнить команду, которая подскажет мне для ввода.Как выполнить двухступенчатую команду с помощью system() или exec()

Я мог бы понять это из-за ошибки & ошибки, но что это лучший способ сделать это?

  • Напишите небольшой командный файл и Exec (I), что?
  • Exec ($ command. '\ R \ n'. $ Input);
  • Что-то еще?

ответ

2

Какова команда, которую вы пытаетесь выполнить? Из комментариев, которые вы оставили, это похоже на то, что вы пытаетесь выполнить сам 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 обычно требует работы четырех труб. Один для входных данных (данные должны быть зашифрованы/дешифрованы), один для выходных данных, один для ошибок и один канал для пароля.

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

1

exec() не предназначен для интерактивных программ. Чтобы иметь возможность поговорить с вашим подпроцессом, вы должны использовать proc_open(), что позволяет осуществлять двунаправленную связь.

+0

Это, безусловно, похоже на способ сделать это, но я все еще пытаюсь заставить пример работать и вернусь к вам. Файл ошибки содержит «php» не распознается как внутренняя или внешняя команда, операционная программа или командный файл ». но php.exe * IS * в моей системе Windows PATH. – Mawg 2010-11-29 02:41:04

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