2015-01-31 5 views
-1

Я Перебор огромного массива и включает в себя несколько запросов API, поэтому, чтобы избежать потери данных и тайм-аут, я делаю это:Нет выхода из цикла

for ($i = 0; $i < $count; $i++) { 
    if ($i % 100 == 0) { 
    echo 'processed: '.$i."\n"; 
    // save to file 
    } 
} 

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

+2

echo out the count, вы действительно получаете 100 штук в prod? –

+0

Как производственная среда отличается от окружающей среды тестирования? Сколько времени занимает примерно? Существуют ли какие-либо ограничения на сервер? Проверьте свой max_execution_time [ссылка] (https://docs.oseems.com/general/application/php/increase-max-execution-time) – Xyaren

+0

Да, но только после того, как скрипт завершил обработку всего. Он не выводит каждый '100' за один раз – 3zzy

ответ

1

выход РНР буферном; см. here. Если вы сбросите буфер (или отключите буферизацию), вы увидите, что это происходит в режиме реального времени.

Как «пояс и скобки», если вы действительно заботитесь о выходе, я бы пересчитал счетчик $, прежде чем вы войдете в цикл.

+0

А я вижу, это хорошая практика для сброса буфера для этих типов скриптов? – 3zzy

+0

Промывка буфера, очевидно, связана с небольшим ресурсом, но если вы хотите увидеть выход «в реальном времени» (т. Е. Близко к в реальном времени), вам нужно либо сбросить буферизацию переключателя. То, что PHP, вероятно, делает, просто сохраняет результат до тех пор, пока вы не нажмете определенное количество контента, а затем автоматически очиститесь (или в конце обработки HTTP-запроса). –

+0

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

-1

Какова цель этого кодового блока? хорошо, до $ я не достигнет 100, это пустая трата ресурсов в любом случае .. вы можете попробовать:

if($count > 100) { 

    ini_set('max_execution_time', 0); // no time limit 

    // $count contains at least $i times 100 
    for($i = 1; $i <= $count/100; $i++) { 
     echo $i * 100; 
    } 

} 
+0

Ваш ответ не будет обрабатывать цикл должным образом. Цель модульного блока - эхо с каждыми 100 итерациями, которые, как я полагаю. Я предполагаю, что фактическая обработка была отредактирована из фрагмента кода. –

+0

@Jeff Watkins Какова цель цикла? И что не так с моей логикой? псевдопрограммист .. – guest123

Смежные вопросы