Я бы сказал, что это довольно простой вопрос, но я застрял с ним:Go интерактивного внешней программой из PHP
мне нужно общаться с внешней программой (в частности, Exim) запускать с некоторыми опциями отладки. Когда я запускаю его из оболочки linux, он выглядит следующим образом: запустите exim -bh 11.22.33.44
, затем прочитайте его вывод (как STDOUT, так и STDERR), тип в некоторой строке из диалога SMTP, затем снова прочитайте вывод Exim, введите другую строку SMTP и так далее. И это хорошо работает, пока я нахожусь в оболочке bash, но когда я запускаю его из скрипта PHP, он застревает в цикле чтения STDIN.
Я использую proc-open
:
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", 'w'),
2 => array("pipe", 'w')
);
$process=proc_open('/usr/sbin/exim -bh 11.22.33.44', $descriptorspec, $pipes, NULL, NULL);
if (is_resource($process)) {
stream_set_blocking($pipes[1], 1);
stream_set_blocking($pipes[2], 1);
while(!feof($pipes[2])) {
$txt2 = fgets($pipes[2]);
}
while(!feof($pipes[1])) {
$txt2 = fgets($pipes[1]);
}
fwrite($pipes[0], 'HELO testhost');
...
}
Выглядит просто, но, как она идет к концу первого STDERR, он застрял.
Пробовал блокировать и разблокировать режим, пытался обменять чтение из STDERR и STDIN - пока не повезло.
Пожалуйста, укажите мне правильный путь!
Проблема заключается в том, что когда я использую режим блокирующих труб, мой скрипт зависает на последней итерации 'fgets()' (то есть, он будет ждать больше данных), когда я устанавливаю режим для разблокировки, t получить (все) текст вообще, поскольку я возвращаюсь довольно быстро. Кстати, спасибо за 'swaks', во всяком случае, никогда не поздно узнать что-то новое! – Alexander