Показать результат цикла в реальном времени


Я использую цикл, чтобы отправить электронную почту из массива. Каждый раз, когда цикл работает функция sleep(4); выполняется.

проблема В том, что для вывода php, только происходит в конце, то есть строки echo "</br>n:".$ne."&nbsp".$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."&nbsp".$user["email"]."</br> >>enviado</br>";
Author: Wallace Maxters, 2016-01-19

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);
}

Я тестировал из двух форм, и он работал отлично на моей машине.

 4
Author: Wallace Maxters, 2016-01-19 18:58:57

Существует несколько методов, которые могут сработать или не в соответствии с окружающей среды.

Вот пример немного отличается от того, что уже было опубликовано:

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%. Не существует магии, которая за все работало стабильно во всех видах окружающей среды. Должны проверить и адаптировать для конкретного случая.

 1
Author: Daniel Omine, 2016-01-19 21:43:09