php shell_exec с обновлением в реальном времени - PullRequest
6 голосов
/ 04 декабря 2011

У меня есть эта оболочка, которую я хочу выполнить по php.Проблема в том, что это может занять много времени, и поэтому мне нужно, чтобы он обновлялся в режиме реального времени в браузере пользователя.

Я прочитал, что мне может потребоваться использовать popen (), но я вроде (хорошо, я действительно: P) нуб PHP и не могу понять, как я могу это сделать.

Буду признателен за любую помощь!

Ответы [ 5 ]

14 голосов
/ 04 декабря 2011
if( ($fp = popen("your command", "r")) ) {
    while( !feof($fp) ){
        echo fread($fp, 1024);
        flush(); // you have to flush buffer
    }
    fclose($fp);
}
2 голосов
/ 12 сентября 2016

есть грязный простой вариант

`yourcommand 1>&2`;

, перенаправляющий стандартный вывод на стандартный вывод.

2 голосов
/ 04 декабря 2011

Есть два возможных поведения:

  1. Non Block, где вам нужно сделать что-то еще между сбросами (@GameBit покажет, как это сделать).

  2. С блоком, в котором вы ждете, пока завершится вызов вызываемой команды, в этом случае посмотрите функция передачи

0 голосов
/ 01 ноября 2018

Я использовал это решение.У меня отлично работает.

$commandString = "myexe";

# Uncomment this line if you want to execute the command in background on Windows
# $commandString = "start /b $commandString";

$exec = popen($commandString, "r");

# echo "Async Code Test";

while($output = fgets($exec, 2048))
{
    echo "$output <br>\n";
    ob_flush();
    flush();
}

pclose($exec);
0 голосов
/ 15 июля 2013

попробуйте этот код (проверено на Windows-машине + сервер wamp)

        header('Content-Encoding: none;');

        set_time_limit(0);

        $handle = popen("<<< Your Shell Command >>>", "r");

        if (ob_get_level() == 0) 
            ob_start();

        while(!feof($handle)) {

            $buffer = fgets($handle);
            $buffer = trim(htmlspecialchars($buffer));

            echo $buffer . "<br />";
            echo str_pad('', 4096);    

            ob_flush();
            flush();
            sleep(1);
        }

        pclose($handle);
        ob_end_flush();
...