как работает выходной буфер php (проблема с использованием $ _SERVER ['REQUEST_TIME'] для вычисления времени выполнения скрипта) - PullRequest
2 голосов
/ 07 июля 2011

Я действительно не знал, как произнести название, поэтому я сделал все, что мог.

у нас есть проблема, при которой мы рассчитываем окончательное время выполнения скрипта (через Интернет).

мы делаем простое

if(time()-$_SERVER['REQUEST_TIME']>X){
    logMe();
}

мы обнаруживаем, что иногда для выполнения сценария требуется больше времени, чем X секунд.

мы на 100% уверены, что это не проблема с mysql, memcached, sphinx или другими обычными преступниками. пожалуйста ... просто предположите, что это не "что-то на нашем конце", удерживающее это.

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

так что я думаю, это должно как-то быть связано с буфером вывода.

поэтому вопрос таков:

в php + apache, как работает выходной буфер? Допустим, у вас есть следующее:

[ 10KB HTML Body Head ]

[ Mysql query #1 ]

[ 50KB HTML Body ]

[ Mysql query #2 ]

[ 20KB HTML Body Footer ]

в этом примере представьте, что у вас установлено клиентское соединение со скоростью 2 КБ / с.

поэтому в самой идеальной ситуации ему потребуется 5 секунд, чтобы получить "HTML Body Head" .

означает ли это, что пройдет 5 секунд, прежде чем "Mysql query # 1" будет выполнен?

Я думаю, вы поняли идею. Влияет ли медленное клиентское соединение на длительность обработки сценария.

еще больше: влияют ли на это какие-либо настройки php.ini, а flush () / ob_flush ()?

спасибо.

Ответы [ 2 ]

3 голосов
/ 07 июля 2011

PHP будет выполняться с максимально возможной скоростью, и если вывод должен быть буферизован, сценарий НЕ будет приостанавливаться, пока буфер не опустеет. Он просто продолжит заполнять буфер до тех пор, пока скрипт не завершится.

Насколько велико ваше значение 'X'? $ _SERVER ['REQUEST_TIME'] исходит от самого Apache, и именно тогда наступает момент попадания. В Apache может быть пауза в ожидании, когда дочерний процесс станет доступным для обслуживания запроса. В PHP могут быть паузы в ожидании открытия ресурса (например, больше нет свободных дескрипторов базы данных, поэтому подождите, пока один из них не освободится). Тогда могут быть задержки для самой базы данных для выполнения и извлечения данных с диска и т. Д.

0 голосов
/ 07 июля 2011

PHP находится на стороне сервера, поэтому время выполнения скрипта не зависит от соединения с клиентом.

PHP обычно выводится после завершения работы скрипта.запуск сценария для вывода, пока этот сценарий еще не завершен.

Тем не менее клиент должен загрузить страницу.

Не думаю, что вы можете многое сделать, когда у вас есть2 КБ / с, кроме обновления их соединения: P

...