Как запустить скрипт оболочки с живой обратной связью от PHP? - PullRequest
3 голосов
/ 20 марта 2012

Как мне выполнить сценарий оболочки из PHP, предоставляя постоянную / живую обратную связь браузеру? Я понимаю из документации system function:

Системный вызов () также пытается автоматически очистить веб-сервер выходной буфер после каждой строки вывода, если PHP работает как сервер модуль.

Мне не ясно, что они имеют в виду, когда запускают его как «серверный модуль».

Пример PHP-кода:

<?php

system('/var/lib/script_test.sh');

Пример кода оболочки:

#!/bin/bash

echo "Start..."
for i in {1..10}
do
        echo "$i..."
        sleep 1
done
echo "Done."

Что это делает: Он будет ждать около 10 секунд и затем сбрасываться в выходной буфер.

Что я хочу сделать: Очистить буфер вывода после каждой строки вывода.

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

Один из вариантов - записать файл в сценарии оболочки, чтобы на каждом шаге указывать, где он находится.На вашей веб-странице используйте ajax-вызов каждые X секунд / минут.Вызов ajax вызовет скрипт PHP, который читает файл состояния и возвращает статус или выполненные шаги.

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

Недостаток, конечно, состоит в том, что чем больше интервал ajax, тем более устаревшим будет обновление.

2 голосов
/ 20 марта 2012

Это можно сделать с помощью popen () , которая дает вам указатель на стандартный вывод любого процесса, который вы открываете.Куски данных могут быть отправлены клиенту с помощью ob_flush () , данные могут быть отображены с помощью XHR.

...