2014-10-05 3 views
0

Я понимаю, как сон работает, но он работает, прежде чем что-то произойдет. Скажем, например, у меня есть несколько эхо, почта и некоторые другие вещи. Затем спать, а затем перенаправить. Ну, похоже, что сон идет первым, тогда все просто спам сразу и вызывает увеличение серверного процессора. Есть ли что-то похожее на сон, которое не будет действовать после того, как вещи не будут выполнены?Неконтролируемый сон? PHP

, например

echo 'Hey'; 
sleep(3); 
echo 'My next text after 3 seconds is up'; 

хорошо, с этим, это не работает, и он делает то же самое, используя C#.

Если это произойдет, страница не ответит в течение 3 секунд, тогда оба сообщения «Привет» & «Мой следующий текст через 3 секунды вверх» покажет все сразу. Является ли им использовать это неправильно? Есть ли что-то еще, что я должен использовать?

Поскольку я никогда не использовал сон, и я видел, как многие люди используют это для одного и того же, и это работает, но в моем случае это не работает так, как я думал.

PHP не C#

+4

Это происходит, когда ответ * буферизирован *. В любом случае это * не * соответствующее использование сна, и неверно выдавать перенаправление после написания других заголовков (чтобы он сломался, если он не был буферизирован). – user2864740

+0

Есть ли что-нибудь еще, кроме сна, которое я мог бы использовать? Или буфер - это то, что я должен использовать? Поскольку я использовал ob_start и flush, когда я использовал сон, но все же получал те же результаты –

+1

Действительно, нужно как можно быстрее генерировать (и возвращать) весь HTTP/HTML-ответ, т.е. без сна. Я не уверен, что сон пытается решить здесь; и в соответствии с вышеизложенным, даже при немедленной записи недействительно выдавать перенаправление после запуска такого вывода. – user2864740

ответ

0

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

header('Content-type: text/html; charset=utf-8'); 
echo 'Hey'; 

for($i=0;$i<60;$i++){ 
    echo "<br />My next text after $i seconds is up"; 
    ob_flush(); 
    flush(); 
    sleep(1); 
} 

Обратите внимание, что php docs for ob_flush suggests, что вы должны попытаться положить заголовок типа содержимого, когда вещи не работают. Но выше код работал и без этого.

0

Он работает точно так же, как он был запрограммирован, дело в том, что выход буферизуется. Вам нужно отключить буферизацию и заставить flush() убедиться, что ее отправили до sleep().

while (@ ob_end_flush()); // closes all existing buffers if any 
echo 'Hey'; 
flush(); // make sure it was flushed to the client 
sleep(3); 
... 

И еще он не может работать во всех случаях, потому что Theres другой буфер, и это тот, который вы не можете контролировать: в браузере. Некоторые браузеры не будут отображать HTML, если он не получил определенный минимальный объем данных.

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