[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Управление процессами, помогите разобраться
Guest
Всем доброго времени суток! Вобщем мне понадобилось написать PHP - скрипт, который бы управлял программой с интерфейсом командной строки (это нужно чтобы перекатать базу данных этой программы в MySQL). Мне нужно вот что: вводить данные в программу - поток ввода, затем получать результат - поток вывода программы, затем опять вводить, опять получать, и тка далее.. В пхп для управления процессом есть функция: proc_open, но у меня с ней немного не получается сделать то что нужно.

1-й косяк, если мы оперируем с простой командной строкой:

PHP
$descriptorspec = array(
    
=> array('pipe''r'), // stdin
    
=> array('pipe''w'), // stdout
    
=> 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($stdout1024); } // здесь программа зависает, потому что не видит конца 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)
Никто не знает? Ладно, я уже выбрал вариант с С++

Уже б подсказали, если б кто знал. Я могу лишь сделать умное лицо при виде этого кода smile.gif

Спустя 23 часа, 31 минута, 3 секунды (2.10.2009 - 13:50) Гость_Sunny написал(а):
Я кстати понял, что почему. Не смог читать данные из потока lexicon я потому что он использует нестандартный для консоли вывод(цветной), а конец потока в командной строке при одновременно чтении и записи я вижу, добавляя во входной поток дополнительную команду.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.