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

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

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

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

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".

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

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

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

Благодарю.


person anonymous-one    schedule 07.07.2011    source источник
comment
PHP всегда будет работать настолько быстро, насколько это возможно, и не будет ждать, пока клиент получит ответ.   -  person hakre    schedule 07.07.2011
comment
Зачем использовать $_SERVER. Использование вызова $time= time() в начале скрипта лучше отражает истинное время начала выполнения. Вместо времени запроса, поскольку время запроса не обязательно является временем начала выполнения скрипта.   -  person frostymarvelous    schedule 07.07.2011
comment
не знал, что переменная $_SERVER['REQUEST_TIME'] была установлена ​​apache:/ вдруг это имеет большой смысл;) всегда предполагалось, что REQUEST_TIME заполняется в тот момент, когда apache передал запрос php .   -  person anonymous-one    schedule 07.07.2011


Ответы (2)


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

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

person Marc B    schedule 07.07.2011
comment
X составляет от 5 до 15 секунд ..... сайт довольно занят, хотя. так что проблема, которую вы упоминаете, вполне возможна. мы будем регистрировать время начала в отдельной переменной, а не полагаться на $_SERVER['REQUEST_TIME'], чтобы получить лучшее представление. - person anonymous-one; 07.07.2011
comment
Спасибо, кстати. это беспокоило меня около ... о ... 1,5 года;) - person anonymous-one; 07.07.2011

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

PHP обычно выводится после завершения скрипта(ов).

Flush можно использовать для вывода долго выполняющегося скрипта, пока этот скрипт еще не завершен.

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

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

person PeeHaa    schedule 07.07.2011
comment
2 КБ/с были просто примером, чтобы сделать вопрос довольно простым для понимания. так что вы говорите, что независимо от того, насколько быстро (или медленно) клиентское соединение, time()-$SERVER['REQUEST_TIME'] в конце скрипта даст истинное время выполнения скрипта? Спасибо. - person anonymous-one; 07.07.2011
comment
@anon1: ага, я об этом и говорил. Веб-сервер получает запрос и просто обрабатывает запрос (без ожидания клиента) и выводит, когда он готов к клиенту. - person PeeHaa; 07.07.2011