Добрый день друзья! помогите узнать в чем дело? Пролог. был редизайн сайта и теперь время выполнения всех скриптов на сайте занимает очень много времени(около 2 секунд), кол-во пользователей растет и с каждым днем будет все хуже. Вопрос в следующем. Очень долго выполняются простейщие циклы. с 5-40 интерациями. вычислений никаких, практически просто echo и все, ниже приведен кусочек кода, в котором конкретно 4-ая итерация занимает больше всего времени(другие же итерация просто "летят"), как такое возможно, в самом коде вы видите ничего там нет кроме echo. Код (Text): <table width=\"155\" align=\"right\" style=\"margin-right:10px;\"> <tr> <td width=\"9\"><img src=\"/design/4/block_orange_left.gif\"></td> <td width=\"137\" style=\"height:35px;\" bgcolor=\"#FFCC33\" align=\"center\"><div style=\"width:100%;\"><a href=\"/medicine/prices/\" class=\"blue_l\">ТОП 5 центров</a></div></td> <td width=\"9\"><img src=\"/design/4/block_orange_right.gif\"></td> </tr> "; $i=0; $str_time .= "<!-- 1/////// прошло времени :".substr((getmicrotime() - $time_script_start), 0, 5)." - ".strtolower($INDEX_array_subsubstr[0])." -->\n"; $result = mysql_query("select * from gx_top_firm where tip=2 order by top limit 5"); while ($row = mysql_fetch_array($result)) { $i++; $str_time .= "<!-- i-".$i."/////// прошло времени :".substr((getmicrotime() - $time_script_start), 0, 5)." - ".strtolower($INDEX_array_subsubstr[0])." -->\n"; echo "<tr><td colspan=\"3\"><img src=\"/design/spacer.gif\" width=\"100%\" height=\"5\"></td></tr> <tr> <td colspan=\"3\" align=\"center\"> <a href=\"/medicine/services/firm".$row["firm"]."/"."\"> <img src=\"".$row["logo"]."\" alt=\"".$row["name"]."\" width=\"145\"> </a> </td></tr>"; } $str_time .= "<!-- 3/////// прошло времени :".substr((getmicrotime() - $time_script_start), 0, 5)." - ".strtolower($INDEX_array_subsubstr[0])." -->\n"; echo " </table> распечатка времени в html(закомментаренная естессно) Код (Text): <!-- 14/////// Время выполнения функции :0.017 - gx_main_block --> <!-- 1/////// прошло времени :0.046 - gx_main_block --> <!-- i-1/////// прошло времени :0.046 - gx_main_block --> <!-- i-2/////// прошло времени :0.046 - gx_main_block --> <!-- i-3/////// прошло времени :0.046 - gx_main_block --> <!-- i-4/////// прошло времени :0.130 - gx_main_block --> <!-- i-5/////// прошло времени :0.130 - gx_main_block --> <!-- 3/////// прошло времени :0.130 - gx_main_block --> <!--4/////// Время выполнения функции :0.209 - gx_main_block --> и таких тормозов очень много, есть еще пара-тройка циклов где такая же ситуация (количество итерация не больше 40). Сразу хочу сказать sql-запрос выполняется ваще быстро(как и положено), такие вещи как, делать echo не так echo"", а так echo''; ничего не решают. Подскажите плиз как такое может быть. Кстати есть вывод станций метро (около 170 штук) в "<option>название станции</option>"; тоже почему-то делается долго, даже экспериментировал и делал вывод не из таблиц(sql), а выводил прям статический текст - тормозит! я в шоке я ведь не вывожу какие-то талмуты, всего-то ничего. Заранее спасибо всем
ну вот здесь Код (Text): <!-- i-1/////// прошло времени :0.046 - gx_main_block --> <!-- i-2/////// прошло времени :0.046 - gx_main_block --> <!-- i-3/////// прошло времени :0.046 - gx_main_block --> <!-- i-4/////// прошло времени :0.130 - gx_main_block --> <!-- i-5/////// прошло времени :0.130 - gx_main_block --> я вывожу сколько времени прошло с начала запуска скрипта, и видно что при первых трех итерациях время проходит очень быстро прошло времени :0.046( само время 0.046, это прошло до тех пор пока скрипт дошел до этого куска кода) и на четвертой итерации проходит много времени (0.130 - 0.046), я думаю понятно, что 50 таких итераций - в итоге получается очень долго, вот я и не понимаю почему так долго выполняется 4-ая итерация
Не может быть дело в другой машине, у меня выделенный сервак мощностей должно хватать. Просьба если не знаете не надо отвечать про вспышки солнце и подобный треп, хотелось бы услышать нормальные комментарии по делу.
Попробуй так: PHP: <?php //... ob_start(); while ($row = mysql_fetch_array($result)) { //... } print ob_get_clean(); //...
Офигенно помогло! спасибо большое, а можно спросить как лучше работать с этой функцией, т.е. перед(и после) каждого цикла использовать или можно в начале и в конце скрипта? и за счет чего она дает прирост(кажется буферизует, да?) а так все отлично, спасибо большое!
было 32М, я делал 128М и 256М, но разницы никакой, но мне уже подсказали, а тебе все равно большое спасибо!
Луше весь вывод буферизуй. А потом один раз сбрасывай буфер. PHP по умолчанию, не сразу выводит текст, а сначала сохраняет его во временном буфере, который сбрасывается по переполнению. Вот этот скачок времени, как раз и происходит в момент сброса буфера. Если же мы используем буферезацию (ob_start()) то PHP будет сохранять данные в буфере, пока мы их сами оттуда не достанем. Выходит, что буфер сбрасывается только один раз. Отсюда и прирост. Пожалуйста.