Всем доброго времени суток! Вобщем мне понадобилось написать PHP - скрипт, который бы управлял программой с интерфейсом командной строки (это нужно чтобы перекатать базу данных этой программы в MySQL). Мне нужно вот что: вводить данные в программу - поток ввода, затем получать результат - поток вывода программы, затем опять вводить, опять получать, и тка далее.. В пхп для управления процессом есть функция: proc_open, но у меня с ней немного не получается сделать то что нужно.
1-й косяк, если мы оперируем с простой командной строкой:
PHP |
$descriptorspec = array( 0 => array('pipe', 'r'), // stdin 1 => array('pipe', 'w'), // stdout 2 => array("file", "/tmp/error-output.txt", "a") // stderr ); // $fpr = proc_open("cmd", $descriptorspec, $pipes, "C:/Program Files/Integra/exe/" );//, $dn);
$stdin = $pipes[0]; $stdout = $pipes[1]; $stderr = $pipes[2];
fwrite($stdin ,"dir\n\0"); $txt = ''; while(!feof($stdout)) { $txt .= fgets($stdout, 1024); } // здесь программа зависает, потому что не видит конца feof выходного потока fwrite($stdin ,"cd C:\\\n\0"); fclose($stdin); echo($txt); fclose($stdout); |
тоесть объясню подробнее - мне нужно писать, потом читать, потом пиасть, потом читать - и так в цикле.. А читать по-нормальному не получается, feof не видит конца потока. По нормальному получается только так - записывать всё, а затем читать всё, но так мне надо не так.
2-й косяк, когда я открываю ту самую программу из командной строки:
PHP |
$fpr = proc_open("cmd", $descriptorspec, $pipes, "C:/Program Files/Integra/exe/" );//, $dn); //proc_open("lexicon.exe", $descriptorspec, $pipes, "C:/Program Files/Integra/exe/" ); так тоже не пашет // $stdin = $pipes[0]; $stdout = $pipes[1]; $stderr = $pipes[2]; // fwrite($stdin ,"lexicon\n\0"); fwrite($stdin ,"0\n\0"); fclose($stdin); echo stream_get_contents($stdout)."<BR><BR>"; // не выводит результат выполнения lexicon |
то результат выполнения этой программы не виден, как если бы я пользовался обычной консолью - видны только фразы самой командной строки типа "C:\Program Files\Integra\exe>lexicon", хотя в поток ввода данные записываются - проверено логом. Может это потому что там текст цветной.. Незнаю.
Так вот, помогите разобрать - почему не виден поток вывода консольной программы, и можно ли вообще из PHP нормально управлять процессом? Если нет, придётся мне через С++ извращаться =)
Спустя 19 часов, 52 минуты, 36 секунд (1.10.2009 - 11:54) SunnyDay написал(а):
Никто не знает? Ладно, я уже выбрал вариант с С++
Спустя 2 часа, 24 минуты, 56 секунд (1.10.2009 - 14:19) SunSet написал(а):
Цитата (SunnyDay @ 1.10.2009 - 08:54) |
Никто не знает? Ладно, я уже выбрал вариант с С++ |
Уже б подсказали, если б кто знал. Я могу лишь сделать умное лицо при виде этого кода
Спустя 23 часа, 31 минута, 3 секунды (2.10.2009 - 13:50) Гость_Sunny написал(а):
Я кстати понял, что почему. Не смог читать данные из потока lexicon я потому что он использует нестандартный для консоли вывод(цветной), а конец потока в командной строке при одновременно чтении и записи я вижу, добавляя во входной поток дополнительную команду.