Выполненный процесс с выводом в реальном времени в PHP

Нет.

Вот несколько примеров почему:

  1. Код шаблона невозможно записать со спецификациями исключения,

    template<class T>
    void f( T k )
    {
         T x( k );
         x.x();
    }
    

    , копии могли бы бросить, передача параметров могла бы бросить, и x() мог бы выдать некоторое неизвестное исключение.

  2. спецификации Исключения имеют тенденцию запрещать расширяемость.

    virtual void open() throw( FileNotFound );
    

    мог бы развиться в [1 120]

    virtual void open() throw( FileNotFound, SocketNotReady, InterprocessObjectNotImplemented, HardwareUnresponsive );
    

    , Вы могли действительно записать, что как [1 121]

    throw( ... )
    

    первое не расширяемо, второе сверхчестолюбиво, и третье действительно, что Вы имеете в виду, когда Вы пишете виртуальные функции.

  3. Унаследованный код

    при написании кода, который полагается на другую библиотеку, Вы действительно не знаете то, что это могло бы сделать, когда что-то идет ужасно неправильно.

    int lib_f();
    
    void g() throw( k_too_small_exception )
    { 
       int k = lib_f();
       if( k < 0 ) throw k_too_small_exception();
    }
    

    g завершится, когда lib_f() броски. Это (в большинстве случаев) не, что Вы действительно хотите. std::terminate() никогда не должен называться. Всегда лучше позволить сбою приложения с необработанным исключением, от которого можно получить отслеживание стека, чем тихо/яростно умереть.

  4. Пишут код, который возвращает распространенные ошибки и бросает на исключительные случаи.

    Error e = open( "bla.txt" );
    if( e == FileNotFound )
        MessageUser( "File bla.txt not found" );
    if( e == AccessDenied )
        MessageUser( "Failed to open bla.txt, because we don't have read rights ..." );
    if( e != Success )
        MessageUser( "Failed due to some other error, error code = " + itoa( e ) );
    
    try
    {
       std::vector<TObj> k( 1000 );
       // ...
    }
    catch( const bad_alloc& b )
    { 
       MessageUser( "out of memory, exiting process" );
       throw;
    }
    

, Тем не менее, когда Ваша библиотека просто выдает Ваши собственные исключения, можно использовать спецификации исключения для утверждения намерения.

67
задан Maksim Vi. 15 August 2009 в 04:23
поделиться

3 ответа

Сначала проверьте, работает ли flush () у вас. Если это так, хорошо, если нет, это, вероятно, означает, что веб-сервер по какой-то причине выполняет буферизацию, например, включен mod_gzip.

Для чего-то вроде ping самый простой способ - это выполнить цикл внутри PHP, запустив команду «ping - c 1 "несколько раз и вызывает flush () после каждого вывода. Предполагая, что PHP настроен на прерывание, когда HTTP-соединение закрывается пользователем (обычно это значение по умолчанию, или вы можете вызвать ignore_user_abort (false), чтобы убедиться), тогда вам не нужно беспокоиться о запущенных процессах ping. .

Если действительно необходимо, чтобы вы запускали дочерний процесс только один раз и отображали его вывод постоянно, это может быть труднее - вам, вероятно, придется запускать его в фоновом режиме,

3
ответ дан 24 November 2019 в 14:30
поделиться

Если вы хотите запускать системные команды через PHP, изучите документацию по exec .

Я бы не рекомендовал делать это на сайте с высокой посещаемостью. , разветвление процесса для каждого запроса - довольно сложный процесс. Некоторые программы предоставляют возможность записать свой идентификатор процесса в файл, чтобы вы могли проверить и завершить процесс по желанию, но для таких команд, как ping, я не уверен, что это возможно, проверьте страницы руководства.

Вы может быть лучше обслужено простым открытием сокета на порту, который вы ожидаете прослушивать (IE: порт 80 для HTTP) на удаленном хосте, так вы будете знать, что все идет хорошо как в пользовательском пространстве, так и в сети.

Если вы пытаетесь вывести двоичные данные, посмотрите функцию заголовка php , и убедитесь, что вы установили правильный content-type и content-disposition . Просмотрите документацию , чтобы получить дополнительную информацию об использовании / отключении буфера вывода.

3
ответ дан 24 November 2019 в 14:30
поделиться

Try changing the php.ini file set "output_buffering = Off". You should be able to get the real time output on the page Use system command instead of exec.. system command will flush the output

0
ответ дан 24 November 2019 в 14:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: