Здравствуйте. Задача: есть консольное приложение, запускаю его из php и с помощью пайпов получаю то, что оно выводит на экран. Проблема: надо выводить на экран результат вывода консольного приложения не после того, как оно закончит работу, а по мере его работы. Т.к. приложение может работать очень долго, а результаы нужно видеть на странице сразу как только оно выведет их на экран. Делаю так: PHP: // выставим тайм лимит на ноль, чтобы браузер не возвращал таймаут в случае долгой операции set_time_limit (0); $descriptorspec = array( 0 => array("pipe", "r"), // stdin 1 => array("pipe", "w"), // stdout 2 => array("pipe", "w") // stderr ?? instead of a file ); $command = '"'.$cmd.'"'; $process = proc_open($command, $descriptorspec, $pipes); stream_set_blocking($pipes[1], FALSE); if (is_resource($process)) { // закроем stdin пайп, т.к. писать в консоль ничего не собираемся fclose($pipes[0]); // не обязательно, но формально // читаем из stdout while (!feof($pipes[1])) { $out .= fgets($pipes[1], 1024); echo $out; //fflush($pipes[1]); } fclose($pipes[1]); fclose($pipes[2]); proc_close($process); } Также, если не заключать чтение в while и каждый раз вызывать этот код, чтобы прочитать содержимое пайпа, то при первом вызове браузер ждет пока не закроется открытый процесс и дальше код не выполняется пока не закрыть открытый процесс (запущенную консольную программу) в ручную. По идее, можно заставить писать вывод консоли в фаил и потом читать этот фаил через заданный промежуток времени, но это не выход. Т.к. тут скорее тоже будет пролема с ожиданием браузера завершения ввыполнения php скрипта, а он, похоже не продолжит выполняться пока запущенная им программа не завершится. Подгружаю данные на страницу с помощью ajax. Так что во прос не про него, а про то, как без использования дополнительного файла-хранилища вывода консольной программы и ожидания завершения запущенной программы подгружать вывод на страницу? Приветствуются любые советы и примеры.
Да, спасибо. Без Ajax, все работает, подгружает результат выполнения программы. Но вот, к сожалению, с аяксом результат http_request.readyState == 4 выдается только после выполнения всего файла .php. Буду разбираться.