Почему скорость выполнения PHP скрипта зависит от ширины канала клиента?

GiS

Новичок
Почему скорость выполнения PHP скрипта зависит от ширины канала клиента?

Здравствуйте!

Столкнулся с такой ситуацией: Скорость выполнения PHP скрипта зависит от ширины канала клиента. Например, на 1 мБит канале составляет 0,5 сек, на 3 мБит - 0,15... Может кто с такой ситуацией сталкивался?
 

GiS

Новичок
Скорость измеряю этим скриптом:

function timer($shift = false)
{
static $first = 0;
static $last;

$now = preg_replace('#^0(.*) (.*)$#', '$2$1', microtime());
if (!$first) $first = $now;
$res = $shift ? $now - $last : $now - $first;
$last = $now;
return $res;
}
timer();

код

echo timer(1);

Да оно и визуально чувствуется задержка...

Цикл while 15 раз вызывает функцию вывода очередного сообщения форума. Проверка времени выполнения всей функции показывает что, например, первых 3 вызова выполняются за 0,001 сек, 4-й вызов 0,5 сек, а при увеличении ширины канала уменьшается до 0,15 сек. И это не случайность, а постоянство. Работы с базой данных в функции нет...
 

tony2001

TeaM PHPClub
>$now = preg_replace('#^0(.*) (.*)$#', '$2$1', microtime());

бог мой, что это?!

скорость выполнения скрипта на сервере никак не зависит от клиента.
PHP выполняется и отдаёт буфер веб-серверу, который уже его шлёт клиенту.
 

GiS

Новичок
:)
Функцию писал не сам, даже не разбирался с ней :)

Неужели сама функция измерения скорости может тормозить?
Но факт остается фактом, скорость меняется и это заметно визуально, ведь одну секунду можно заметить...
 

boombick

boombick.org
Почему скорость выполнения PHP скрипта зависит от радиуса кривизны рук девелопера?
 

dimagolov

Новичок
да ну ладно. если одтавать много данных и не делать ob_, то апач не будет принимать от php вывод если у него клиент не забрал предидущие данные и скрипт будет реально зависать на выводе.

если делать ob_, то скрипт отработает без задержек.

п.с. по крайней мере на Win32 и php как модуль вышесказанное верно
 

GiS

Новичок
О, это уже интереснее :)
Потому что после экспериментов с замерами времени выполнения скрипта, заметил что замедление происходит после вывода некоторых переменных с помощью echo...
Если б вы еще натолкнули на правильный путь поисков, т.е., что такое ob_?
 

MiksIr

miksir@home:~$
По я.. рукам нада бить за выдачу даже десятков мегабайт скриптом ;)
 

dimagolov

Новичок
MiksIr, случаи разные бывают. вот мне в веб-морде к БД, которая живет строго в локалке, надо было отдавать результаты запроса весом в пару-тройку мег. я очень удивлялся, увидев что скорость выполнения скрипта зависит не только (и не столько) от времени запроса к БД, которое было пренебрежительно мало, а от того какой клиент и через какое соединение (ethernet, wlan) забирает результат. это наложилось у меня в тот момент на глючный свич, который страшно тормозил при определенных вариантах подключения и как итог время исполнения именно скрипта на одних и тех же запросах для разных клиентов различалось на порядки.

GiS, в ман по ob_start и потом читать весь раздел.
 

MiksIr

miksir@home:~$
dimagolov, бывают разные, не спорю. Ну лучше все ж так не делать даж в локале - можно случайно привыкнуть ;)
 

Angerslave

Новичок
Не проще ли nginx воткнуть перед апачем для медленных клиентов и задать ему кеш метров побольше?
 

GiS

Новичок
Добился результата.
В начале кода поставил:

function callback($buffer)
{
return (str_replace("apples", "oranges", $buffer));
}
ob_start("callback");

весь мой код;

ob_end_flush();

Всетаки, похоже, как писалось выше, апач тормозил с приемом кода от пхп!

Время выполнения самого злостного кода уменьшилось с 0,75 сек до 0,05 сек.
Всем громадное спасибо за помощь! Действительно, оч. помогли, натолкнули на правильный путь! :)
 

dimagolov

Новичок
Angerslave
ob_end_flush(); по завершению скрипта и так получиться. что имеет смысл делать, так это ob_flush(); flush(); по ходу дела, чтобы если данных много, то бить их на блоки и скидывать в апач, а следовательно и клиенту, а не собирать в памяти.
 
Сверху