Winner
Новичок
Управление внешней программой или чтение при открытом дескрипторе
Здравствуйте уважаемые. Пожалуйста помогите разобраться в управлении запущенной внешней программы. Для примера взят FTP клиент. Если записываемый дескриптор не закрывать после записи в него, то читаемый дескриптор не получается прочитать. Это не позволяет управление программой в зависимости от полученного от нее вывода. Рабочий вариант в коде помечен РАБОТАЕТ.
Может проблему управления запущенной внешней программы можно решить другим способом? Заранее благодарю за помощь.
-~{}~ 06.11.06 14:42:
Тишина... все усиленно готовятся к демонстрации.
Здравствуйте уважаемые. Пожалуйста помогите разобраться в управлении запущенной внешней программы. Для примера взят FTP клиент. Если записываемый дескриптор не закрывать после записи в него, то читаемый дескриптор не получается прочитать. Это не позволяет управление программой в зависимости от полученного от нее вывода. Рабочий вариант в коде помечен РАБОТАЕТ.
Может проблему управления запущенной внешней программы можно решить другим способом? Заранее благодарю за помощь.
PHP:
<?php
$descriptorspec = array(
0 => array("pipe", "r"), // stdin это канал, из которого потомок будет читать
1 => array("pipe", "w"), // stdout это канал, в который потомок будет записывать
2 => array("file", "/tmp/errors.txt", "a"), // stderr это файл для записи
);
$process = proc_open("ftp", $descriptorspec, $pipes);
if (is_resource($process)) {
// $pipes выглядит теперь примерно так:
// 0 => записываемый дескриптор, соединённый с дочерним stdin
// 1 => читаемый дескриптор, соединённый с дочерним stdout
// вывод ошибки будет присоединён к /tmp/errors.txt
fwrite($pipes[0], "open ftp.host.ru\n");
//fclose($pipes[0]); // РАБОТАЕТ
stream_set_blocking($pipes[1], FALSE);
//while(!feof($pipes[1])) { $viewOutput .=fgets($pipes[1]); } // РАБОТАЕТ
while($getLine =fread($pipes[1], 2)) { $viewOutput .=$getLine; } // НЕ РАБОТАЕТ
fclose($pipes[0]); // НЕ РАБОТАЕТ
fclose($pipes[1]);
$return_value = proc_close($process);
echo "command returned $return_value\n";
}
?>
Тишина... все усиленно готовятся к демонстрации.
