Здравствуйте. ОС: Ubuntu Server 9.10 x64 PHP: 5.2.10-2ubuntu6.4 Код (Text): header('Content-Type: text/plain'); $descriptorspec = array( 0 => array("pipe", "r"), // stdin is a pipe that the child will read from 1 => array("pipe", "w"), // stdout is a pipe that the child will write to 2 => array("pipe", "w") // stderr is a file to write to ); $conn = proc_open('ftp', $descriptorspec, $pipes); if (is_resource($conn)) { $wh = &$pipes[0]; $rh = &$pipes[1]; $eh = &$pipes[2]; stream_set_blocking($eh, false); sleep(1); // читатем все что программа вывела при запуске и игнорируем - странно то что все равно ничего не получаем // даже строку приглашения [b]ftp >[/b] stream_set_blocking($rh, false); echo "Response:\n".stream_get_contents($rh); stream_set_blocking($rh, true); fwrite($wh, "help"); fclose($wh); echo "Error:\n".stream_get_contents($eh); // пустой echo "Response:\n".stream_get_contents($rh); // список команд foreach($pipes as $pipe) @fclose($pipe); $return_value = proc_close($conn); echo "command returned $return_value\n"; } ?> этот скрипт работает, но мне к сожалению нужно иметь возможность отсылать не одну команду а много, тоесть не закрывать каждый раз pipe после использования. Код (Text): header('Content-Type: text/plain'); $descriptorspec = array( 0 => array("pipe", "r"), // stdin is a pipe that the child will read from 1 => array("pipe", "w"), // stdout is a pipe that the child will write to 2 => array("pipe", "w") // stderr is a file to write to ); $conn = proc_open('ftp', $descriptorspec, $pipes); if (is_resource($conn)) { $wh = &$pipes[0]; $rh = &$pipes[1]; $eh = &$pipes[2]; stream_set_blocking($eh, false); sleep(1); // читатем все что программы вывела при запуске и игнорируем stream_set_blocking($rh, false); echo "Response:\n".stream_get_contents($rh); stream_set_blocking($rh, true); fwrite($wh, "help\n"); fflush($wh); sleep(1); echo "Error:\n".stream_get_contents($eh); echo "Response:\n".stream_get_contents($rh); // дальше этого скрипт не выполняется fwrite($wh, "open ftp.some.domain\n"); fflush($wh); sleep(1); echo "Error:\n".stream_get_contents($eh); echo "Response:\n".stream_get_contents($rh); foreach($pipes as $pipe) @fclose($pipe); $return_value = proc_close($conn); echo "command returned $return_value\n"; } ?> этот скрипт не работает - он блокируется на первом echo "Response:\n".stream_get_contents($rh);, ожидает поступления даннных на $rh. чтобы скриптец не блокировался есть два варианта 1. который уже не подходит - использовать fclose вместо fflush, тогда естественно вторая команда не выполнится. И придется каждый раз открывать процеес для новой команды. 2. отменить блокировку для $rh - скрипт не блокируется, но команды все равно не выполняются и приходят пустые ответы посмотрел все примеры в документации - они для меня не работают. теперь вопросы: 1. можно ли вообще PHP c proc_open использовать для такого интерактивного взаимодействия 2. может ли команда ftp ожидать еще какойто символ (черт знает какой - может EOF). что то типа fwrite($wh, 'help\n\z'); 3. что еще может быть не правильно, может гдето INI файл поправить нужно.... уже даже не знаю что и предположить кстати не суть важно какой процесс открывать - вместо ftp может быть php, или какаято другая программа....результат один и тотже... к сожалению
Код (Text): $read = array( $rh ); $write = NULL; $except = NULL; stream_select( $pipes_array, $write, $except, 0 );
а тут нет ошибочки может Код (Text): ... stream_select( $read, $write, $except, 0 );[/quote] я помню ковырялся с stream_select, но что то не вішло тогда наверно нужно еще раз попробовать