Показать результат цикла в реальном времени
Я использую цикл, чтобы отправить электронную почту из массива.
Каждый раз, когда цикл работает функция sleep(4);
выполняется.
проблема В том, что для вывода php, только происходит в конце, то есть строки echo "</br>n:".$ne." ".$user["email"]."</br> >>enviado</br>";
, показаны output всех сразу, а после того, как все петли выполняются.
я Хотел бы, что, поскольку каждый цикл запуска, функция эхо отображается (и не в ос раз в конце).
foreach($users as $user) {
$message->setTo($user["email"], $user["nome"]);
echo "\n";sleep(4);
flush();
ob_end_flush();
echo date('h:i:s');
$mailer->send($message);
echo date('h:i:s') . "\n";
$ne++;
echo "</br>n:".$ne." ".$user["email"]."</br> >>enviado</br>";
2 answers
, Вероятно, ты говоришь о чем - ob_implicit_flush
. Да, можно отображать выходные данные в php даже во время выполнения цикла, не дожидаясь, когда этот цикл закончен еще. То есть данные будут напечатаны в клетки.
ob_implicit_flush(true);
foreach (range(1, 50) as $value)
{
echo "Imprimindo {$value}";
ob_flush();
sleep(1);
}
Php.ini настроен так, что буфер будет запускаться автоматически.
, Если вы не знаете, если ваш вывода буфера является автоматическая или нет в php.ini, вы можете сделать это небольшая проверка, чтобы все работало верно.
if (ob_get_level() > 0) {
ob_start();
}
, Еще и дополняет ответ, вы можете сделать это только с помощью функции flush
, при условии, что не используется ничего связанных с вывода буфера в коде.
Тогда вы можете сделать так:
// Fallback para garantir que não vai ter a configuração no php.ini
while(ob_get_level() > 0) ob_end_clean();
foreach (range(1, 50) as $value)
{
echo "Imprimindo {$value}";
flush();
sleep(1);
}
Я тестировал из двух форм, и он работал отлично на моей машине.
Существует несколько методов, которые могут сработать или не в соответствии с окружающей среды.
Вот пример немного отличается от того, что уже было опубликовано:
ini_set('zlib.output_compression', 0);
ini_set('implicit_flush', 1);
ob_end_clean();
echo 'Hello World!';
flush();
ob_flush();
for ($i = 1; $i < 6; $i++) {
sleep(1);
echo PHP_EOL.'<br />'.$i;
flush();
ob_flush();
}
Единственная разница в том, что в этом примере desabilitamos сжатия zlib, который обычно включен по умолчанию.
Важно также, что мы, используя ob_end_clean(), прежде чем начать процессы, чтобы гарантировать, что любой выходной буфер уже существующий быть удален.
" Не должно быть размещен обязательно в первой строке кода. Просто быть до логики первоначального сценария буфера, с которой хотите работать.
Проблема, которая может иметь в этом примере выше в том, что последний цикл не уважает sleep(1)
, поскольку в печати вскоре после предпоследнего. Но такое поведение не происходит в определенных условиях.
- Это очень сложно ударить что-то, что работает 100%. Не существует магии, которая за все работало стабильно во всех видах окружающей среды. Должны проверить и адаптировать для конкретного случая.