Взаимодействие с консольной программой

Gorynych

Посетитель PHP-Клуба
Destroyer сдается мне, что проблема:

а) с определением stderr
б) с циклом чтения
в) лучше все же закрывать stdin

PHP:
set_time_limit(600); // Как у нас с лимитом на  временя выполнения?

$descriptorspec = array(
    0 => array("pipe", "r"),		       // stdin
    1 => array("pipe", "w"),  		     // stdout
    2 => array("file", "error_log", "a") // stderr, если не нужно - то в качестве файла указываем "null" или "/dev/null"
);

$cmd = 'dir';

// команда полностью выглядит как dir "C:\\Program Files"
// - окружаем ковычками параметр, содержащий пробелы
$cmd = sprintf('%s "%s"', $cmd, "C:\\Program Files");

stream_set_blocking($pipes[1], FALSE);
if (is_resource($process)) {
    fclose($pipes[0]); // не обязательно, но формализм не всегда мешает :-)

    // вот этот вариант ошибочный, он не выведет полный листинг,
    // а обломается :-)
    // while ( ($s = fgets($pipes[1], 2)) ) {
    //     echo $s;
    // }
    
    // а вот так - результат будет лучше:
    while ( !feof($pipes[1]) ) {
    	$s = fgets($pipes[1], 2);
	echo $s;
    }

    fclose($pipes[1]);
    proc_close($process);
}
 

MiRacLe

просто Чудо
kode
консоль винды не поддерживает пайпы, те prog.exe > my.log сделать не удастся (те работать не будет)
Тебе лучше жевать...

Код:
c:\>chcp 866 && dir > ls.txt && start notepad.exe c:\ls.txt
 

Destroyer

Новичок
в чем такая актуальность мультиплатформенности?
Просто этот скрипт надо запускать и на nix, и на win, чтобы избежать написания двух разных демонов хотелось бы все решить на php.

Gorynych, спасибо за замечания, я никак не мог решить что лучше !eof или как у меня в примере.
Всеже, похоже, прийдется делать через > log.txt и его читать по таймеру, чтобы оперативно выводить информацию работы на страничку. Вроде этот вариант довольно универсален - без дополнительных демонов и в nix и win работает.

Небольшой оффтоп: подскажите плз, как в nix определить запущена ли какая-либо программа уже или нет с помощью встроенных средств (типа bash). Путь до программы известен. Или просто получить список всех запущенных процессов с путями до исполняемых файлов, чтобы найти там процесс запускаемой мной через php программы для проверки работает она или нет.
 
Сверху