Я просто экспериментирую с PHP и shell_exec
на моем Linux-сервере. Это действительно крутая функция, и я до сих пор наслаждаюсь ею. Есть ли способ просмотра живого вывода, который выполняется во время выполнения команды?
Например, если ping stackoverflow.com
был запущен, в то время как он просматривает целевой адрес, каждый раз, когда он пингует, показывайте результаты с помощью PHP? Это возможно?
Мне бы хотелось увидеть текущее обновление буфера во время его работы. Возможно, это невозможно, но было бы неплохо.
Это код, который я пытаюсь, и каждый раз, когда я его пробовал, он всегда отображает результаты после завершения команды.
<?php $cmd = 'ping -c 10 127.0.0.1'; $output = shell_exec($cmd); echo "<pre>$output</pre>"; ?>
Я попытался поставить часть echo
в цикл, но все равно не повезло. У кого-нибудь есть предложения по тому, чтобы он отображал живое выступление на экране вместо ожидания до завершения команды?
Я пробовал exec
, shell_exec
, system
и passthru
. Каждый из них отображает контент после его завершения. Если я не использую неправильный синтаксис, или я неправильно настрою цикл.
Чтобы прочитать результат процесса, popen()
– это путь. Ваш скрипт будет работать параллельно с программой, и вы можете взаимодействовать с ним, читая и записывая его вывод / ввод, как если бы это был файл.
Но если вы просто хотите сбросить результат прямо к пользователю, вы можете разрезать дерьмо и использовать passthru()
:
echo '<pre>'; passthru($cmd); echo '</pre>';
Теперь, если вы хотите отображать вывод во время выполнения программы, вы можете сделать это:
while (@ ob_end_flush()); // end all output buffers if any $proc = popen($cmd, 'r'); echo '<pre>'; while (!feof($proc)) { echo fread($proc, 4096); @ flush(); } echo '</pre>';
Этот код должен запускать команду и выводить результат прямо на конечного пользователя во время выполнения.
Прежде всего, спасибо Хавендару за ваш фрагмент – это очень помогло!
Немного измененная версия кода Хэвендара, которую я нашел полезной.
<?php /** * Execute the given command by displaying console output live to the user. * @param string cmd : command to be executed * @return array exit_status : exit status of the executed command * output : console output of the executed command */ function liveExecuteCommand($cmd) { while (@ ob_end_flush()); // end all output buffers if any $proc = popen("$cmd 2>&1 ; echo Exit status : $?", 'r'); $live_output = ""; $complete_output = ""; while (!feof($proc)) { $live_output = fread($proc, 4096); $complete_output = $complete_output . $live_output; echo "$live_output"; @ flush(); } pclose($proc); // get exit status preg_match('/[0-9]+$/', $complete_output, $matches); // return exit status and intended output return array ( 'exit_status' => intval($matches[0]), 'output' => str_replace("Exit status : " . $matches[0], '', $complete_output) ); } ?>
Пример использования:
$result = liveExecuteCommand('ls -la'); if($result['exit_status'] === 0){ // do something if command execution succeeds } else { // do something on failure }