#php #while-loop
#php #во время цикла
Вопрос:
Мне нужно заставить мою страницу PHP отображать сообщение после каждого раунда в цикле .. не в конце цикла .. поскольку я запускаю бесконечный цикл. цель состоит в том, что у меня есть скрипт внутри страницы, который запускает команду на сервере .. принимает выходные данные и сравнивает данные с инструкцией IF, если он проверяет, отображает сообщение .. если нет .. он спит в течение трех секунд и снова запускает цикл. проблема в том, что когда я запускаю файл php из командной строки на сервере, он делает именно то, что должен делать .. отображает сообщение каждые 3 секунды (не нажимая кнопку подтверждения).. но когда я запускаю его в браузере, он ничего не отображает (он ожидает завершения цикла!) не уверен, что мой приведенный ниже пример будет служить этой цели.
<?php
while (1==1) {
$answer = shell_exec ("COMMAND'");
list($src, $app, $cid, $non, $flag, $dur, $exten) = explode("!", $answer);
if ($cid > 0) {
echo "<script language='javascript'>
var r=confirm('You have a call from $cid: Show Data?')
if (r==true)
{
OPEN A WEB PAGE INSIDE AN IFRAME
}
</script>";
//header( 'refresh: 15; url=monit.php' );
flush();
sleep(10);
}
else {
//header( 'refresh: 1; url=monit.php' );
sleep(1);
}
}
?>
Пожалуйста, обратите внимание, что я пытался использовать функцию «header ()» для перезагрузки страницы, однако я не хочу перезагружать саму страницу (создаст осложнения внутри родительской страницы)
Есть предложения?
Комментарии:
1. Пожалуйста, сделайте отступ в своем коде. Я едва могу его прочитать. Что касается вашего вопроса, нет. Вы должны сделать это с помощью AJAX, поскольку PHP не может печатать такой текст (браузер обычно отключается).
2. Выключите
zlib
/gzip
выключите, если вы этого еще не сделали.3. вы когда-нибудь использовали ob_start()?
Ответ №1:
Есть несколько вещей, которые нужно проверить, упомянутых на странице руководства для функции сброса:
flush() может быть не в состоянии переопределить схему буферизации вашего веб-сервера, и это никак не влияет на буферизацию на стороне клиента в браузере
Несколько серверов, особенно на Win32, все равно будут буферизировать выходные данные вашего скрипта, пока он не завершится, прежде чем передавать результаты в браузер.
Серверные модули для Apache, такие как mod_gzip, могут выполнять собственную буферизацию, что приведет к тому, что функция flush() не приведет к немедленной отправке данных клиенту.
Есть также некоторые параметры конфигурационного файла, которые необходимо проверить, упомянутые в комментариях
Если функция flush() не работает. Вы должны установить следующие параметры в php.ini, например:
output_buffering = Off
;output_handler =
zlib.output_compression = Off
;zlib.output_handler =
Я также заметил, что есть закомментированные строки, вызывающие обновление страницы — вам не нужно обновлять страницу, чтобы увидеть новый вывод, браузер должен показывать страницу как все еще загружающуюся, пока скрипт не завершится.
Ответ №2:
Как уже было сказано, если у вас нет полного контроля над сервером, это было бы невозможно реализовать, и даже если бы вы это сделали, если бы вы хотели сохранить соединение открытым в течение значительного промежутка времени, вероятно, истек бы тайм-аут, требующий продолжения на стороне клиента.
Таким образом, вероятно, было бы лучше использовать AJAX, например:
ping.php
$answer = shell_exec('COMMAND');
$r = array();
list($r['src'], $r['app'], $r['cid'], $r['non'], $r['flag'], $r['dur'], $r['exten']) = explode("!", $answer);
if($r['cid'] > 0)
$r['success'] = true;
else
$r['success'] = false;
echo json_encode($r);
Скрипт в вашем общедоступном файле HTML / PHP
<script type="text/javascript">
// If you're using jQuery...
var ping = function() {
$.ajax('ping.php', {
dataType: 'json',
success: function(data) {
if(data.success amp;amp; confirm('You have a call from ' data.cid ': show data>'))
$('iframe').attr('src', 'new_page.php');
}
});
};
setInterval(ping, 3000);
</script>
Ответ №3:
Поместите это в свой htaccess (повороты gzip):
SetEnv no-gzip dont-vary
и чтобы повторить сообщение и очистить выходной буфер, сделайте это в своем цикле:
echo $msg;
ob_flush();
flush();