За последние 24 часа нас посетили 18353 программиста и 1625 роботов. Сейчас ищут 1826 программистов ...

Подгрузка на страницу вывода консольного приложения

Тема в разделе "Прочие вопросы по PHP", создана пользователем Destroyer, 11 май 2009.

  1. Destroyer

    Destroyer Активный пользователь

    С нами с:
    11 май 2009
    Сообщения:
    4
    Симпатии:
    0
    Здравствуйте.
    Задача: есть консольное приложение, запускаю его из php и с помощью пайпов получаю то, что оно выводит на экран.
    Проблема: надо выводить на экран результат вывода консольного приложения не после того, как оно закончит работу, а по мере его работы. Т.к. приложение может работать очень долго, а результаы нужно видеть на странице сразу как только оно выведет их на экран.
    Делаю так:
    PHP:
    1.  
    2. // выставим тайм лимит на ноль, чтобы браузер не возвращал таймаут в случае долгой операции
    3. $descriptorspec = array(
    4.     0 => array("pipe", "r"),  // stdin
    5.     1 => array("pipe", "w"),  // stdout
    6.     2 => array("pipe", "w")   // stderr ?? instead of a file
    7.     );
    8. $command = '"'.$cmd.'"';
    9.  
    10. $process = proc_open($command, $descriptorspec, $pipes);
    11. stream_set_blocking($pipes[1], FALSE);
    12. if (is_resource($process)) {   
    13.  
    14. // закроем stdin пайп, т.к. писать в консоль ничего не собираемся
    15. fclose($pipes[0]); // не обязательно, но формально
    16.  
    17. // читаем из stdout
    18. while (!feof($pipes[1]))
    19. {
    20. $out .= fgets($pipes[1], 1024);
    21. echo $out;
    22. //fflush($pipes[1]);
    23. }
    24.  
    25. fclose($pipes[1]);
    26. fclose($pipes[2]);
    27. proc_close($process);
    28. }
    29.  
    Также, если не заключать чтение в while и каждый раз вызывать этот код, чтобы прочитать содержимое пайпа, то при первом вызове браузер ждет пока не закроется открытый процесс и дальше код не выполняется пока не закрыть открытый процесс (запущенную консольную программу) в ручную.
    По идее, можно заставить писать вывод консоли в фаил и потом читать этот фаил через заданный промежуток времени, но это не выход. Т.к. тут скорее тоже будет пролема с ожиданием браузера завершения ввыполнения php скрипта, а он, похоже не продолжит выполняться пока запущенная им программа не завершится.
    Подгружаю данные на страницу с помощью ajax. Так что во прос не про него, а про то, как без использования дополнительного файла-хранилища вывода консольной программы и ожидания завершения запущенной программы подгружать вывод на страницу?

    Приветствуются любые советы и примеры.
     
  2. zheka_13

    zheka_13 Активный пользователь

    С нами с:
    1 май 2009
    Сообщения:
    71
    Симпатии:
    0
  3. Destroyer

    Destroyer Активный пользователь

    С нами с:
    11 май 2009
    Сообщения:
    4
    Симпатии:
    0
    Да, спасибо. Без Ajax, все работает, подгружает результат выполнения программы. Но вот, к сожалению, с аяксом результат http_request.readyState == 4 выдается только после выполнения всего файла .php.
    Буду разбираться.