получить вывод команды shell_exec при запуске команды

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

$tmp = shell_exec("update_flash -v " . $filename . " 4 2>&1");
echo '<h3>' . $tmp . '</h3>';

echo verifyResults($tmp);

(Функция verifyResults вернет некоторый HTML, который указывает пользователю, успешно ли завершилась команда обновления. Т.е., в случае успешного завершения обновления, отобразить кнопку для перезапуска устройства и т. Д. )

Проблема в том, что выполнение команды обновления занимает несколько минут, а сценарий PHP блокируется до завершения команды оболочки, прежде чем он вернет какой-либо результат. Обычно это означает, что команда обновления продолжит выполнение, в то время как пользователь увидит ошибку HTTP 504 (в худшем случае) или будет ждать загрузки страницы в течение нескольких минут.

Я думал о том, чтобы сделать что-то вроде этого:

shell_exec("rm /tmp/output.txt");
shell_exec("update_flash -v " . $filename . " 4 2>&1 >> /tmp/output.txt &");
echo '<div id="output"></div>';
echo '<div id="results"></div>';

Теоретически это поместило бы команду в фоновый режим и добавило бы весь вывод в /tmp/output.txt.

. А затем в функции Javascript я бы периодически запрашивал getOutput.php, который просто печатал бы содержимое / tmp /output.txt и вставьте его в div "output". Как только команда будет полностью выполнена, другая функция Javascript обработает вывод и отобразит результат в «результатах». div.

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

Я мог бы переместить getOutput.php в другой раздел на устройстве, но тогда я думаю, что мне все равно придется сделать некоторые забавные штуки с конфигурацией веб-сервера, чтобы иметь возможность получить к нему доступ (символическая ссылка на него из корневого веб-сервера, как и любой другой файл, в конечном итоге будет перезаписана во время повторной прошивки).

Есть ли другой способ отображения вывод команды во время ее выполнения, или мне просто следует обойтись имеющимся у меня решением?

Редактировать 1: В настоящее время я тестирую некоторые решения. Я' Я обновлю свой вопрос с результатами позже.

Редактировать 2: Кажется, что файловая система не перезаписывается, как я первоначально думал. Вместо этого система, кажется, монтирует существующую файловую систему в режиме только для чтения, поэтому я все еще могу получить доступ к getOutput.php даже после повторной прошивки файловой системы.

Второе решение, которое я описал в моем вопросе, похоже, работает дополнительно с использованием popen (как указано в ответе ниже) вместо shell_exec. Страница загружается, и через Ajax я могу отобразить содержимое output.txt.

Однако кажется, что output.txt не отражает вывод команды re-flash в реальном времени - кажется, ничего не отображать, пока команда обновления не вернется из выполнения. Мне нужно будет провести дальнейшее тестирование, чтобы увидеть, что здесь происходит.

Редактировать 3: Неважно, похоже, что файл является текущим, когда я обращаюсь к нему. У меня просто была задержка, когда ядро ​​выполняло некоторые задачи, связанные с JFFS2, вызванные тем, что я использовал раздел, на котором хранится исходный образ JFFS2. Я не знаю почему, но это, по-видимому, приводит к блокировке всех сценариев PHP, пока это не будет выполнено.

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

6
задан Jason Plank 7 December 2010 в 18:38
поделиться