За последние 24 часа нас посетили 18087 программистов и 1668 роботов. Сейчас ищут 2063 программиста ...

Тормозит то ли вывод текста, то ли циклы

Тема в разделе "Прочие вопросы по PHP", создана пользователем tanir, 7 апр 2008.

  1. tanir

    tanir Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    6
    Симпатии:
    0
    Добрый день друзья! помогите узнать в чем дело?
    Пролог. был редизайн сайта и теперь время выполнения всех скриптов на сайте занимает очень много времени(около 2 секунд), кол-во пользователей растет и с каждым днем будет все хуже.
    Вопрос в следующем.
    Очень долго выполняются простейщие циклы. с 5-40 интерациями. вычислений никаких, практически просто echo и все, ниже приведен кусочек кода, в котором конкретно 4-ая итерация занимает больше всего времени(другие же итерация просто "летят"), как такое возможно, в самом коде вы видите ничего там нет кроме echo.
    Код (Text):
    1.             <table width=\"155\" align=\"right\" style=\"margin-right:10px;\">
    2.             <tr>
    3.                 <td width=\"9\"><img src=\"/design/4/block_orange_left.gif\"></td>
    4.                 <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>
    5.                 <td width=\"9\"><img src=\"/design/4/block_orange_right.gif\"></td>
    6.             </tr>   ";
    7.  
    8.                 $i=0;
    9.                 $str_time .= "<!-- 1/////// прошло времени :".substr((getmicrotime() - $time_script_start), 0, 5)." - ".strtolower($INDEX_array_subsubstr[0])." -->\n";
    10.                 $result = mysql_query("select * from gx_top_firm where tip=2 order by top limit 5");
    11.                 while ($row = mysql_fetch_array($result))
    12.                 {   $i++;
    13.                     $str_time .= "<!-- i-".$i."/////// прошло времени :".substr((getmicrotime() - $time_script_start), 0, 5)." - ".strtolower($INDEX_array_subsubstr[0])." -->\n";
    14.                     echo    "<tr><td colspan=\"3\"><img src=\"/design/spacer.gif\" width=\"100%\" height=\"5\"></td></tr>
    15.                         <tr>
    16.                         <td colspan=\"3\" align=\"center\">
    17.                             <a href=\"/medicine/services/firm".$row["firm"]."/"."\">
    18.                                 <img src=\"".$row["logo"]."\" alt=\"".$row["name"]."\" width=\"145\">
    19.                             </a>
    20.                         </td></tr>";
    21.                 }
    22.                 $str_time .= "<!-- 3/////// прошло времени :".substr((getmicrotime() - $time_script_start), 0, 5)." - ".strtolower($INDEX_array_subsubstr[0])." -->\n";
    23.  
    24.             echo "  </table>
    распечатка времени в html(закомментаренная естессно)
    Код (Text):
    1. <!-- 14/////// Время выполнения функции :0.017 - gx_main_block -->
    2. <!-- 1/////// прошло времени :0.046 - gx_main_block -->
    3. <!-- i-1/////// прошло времени :0.046 - gx_main_block -->
    4. <!-- i-2/////// прошло времени :0.046 - gx_main_block -->
    5. <!-- i-3/////// прошло времени :0.046 - gx_main_block -->
    6. <!-- i-4/////// прошло времени :0.130 - gx_main_block -->
    7. <!-- i-5/////// прошло времени :0.130 - gx_main_block -->
    8. <!-- 3/////// прошло времени :0.130 - gx_main_block -->
    9. <!--4/////// Время выполнения функции :0.209 - gx_main_block -->
    и таких тормозов очень много, есть еще пара-тройка циклов где такая же ситуация (количество итерация не больше 40). Сразу хочу сказать sql-запрос выполняется ваще быстро(как и положено), такие вещи как, делать echo не так echo"", а так echo''; ничего не решают. Подскажите плиз как такое может быть.
    Кстати есть вывод станций метро (около 170 штук) в "<option>название станции</option>"; тоже почему-то делается долго, даже экспериментировал и делал вывод не из таблиц(sql), а выводил прям статический текст - тормозит! я в шоке я ведь не вывожу какие-то талмуты, всего-то ничего.
    Заранее спасибо всем:)
     
  2. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    пока так и не понял (и сомневаюсь, что ты правильно вытащил), где именно тормозит.
     
  3. tanir

    tanir Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    6
    Симпатии:
    0
    ну вот здесь
    Код (Text):
    1. <!-- i-1/////// прошло времени :0.046 - gx_main_block -->
    2. <!-- i-2/////// прошло времени :0.046 - gx_main_block -->
    3. <!-- i-3/////// прошло времени :0.046 - gx_main_block -->
    4. <!-- i-4/////// прошло времени :0.130 - gx_main_block -->
    5. <!-- i-5/////// прошло времени :0.130 - gx_main_block -->
    я вывожу сколько времени прошло с начала запуска скрипта, и видно что при первых трех итерациях время проходит очень быстро прошло времени :0.046( само время 0.046, это прошло до тех пор пока скрипт дошел до этого куска кода) и на четвертой итерации проходит много времени (0.130 - 0.046), я думаю понятно, что 50 таких итераций - в итоге получается очень долго, вот я и не понимаю почему так долго выполняется 4-ая итерация
     
  4. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Из-за вспышки на солнце.

    p.s. попробуй запусти скрипт на другой машине.
     
  5. tanir

    tanir Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    6
    Симпатии:
    0
    Не может быть дело в другой машине, у меня выделенный сервак мощностей должно хватать.
    Просьба если не знаете не надо отвечать про вспышки солнце и подобный треп, хотелось бы услышать нормальные комментарии по делу.
     
  6. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  7. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    А памяти для php у тебя сколько выделено?
     
  8. tanir

    tanir Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    6
    Симпатии:
    0
    Офигенно помогло! спасибо большое, а можно спросить как лучше работать с этой функцией, т.е. перед(и после) каждого цикла использовать или можно в начале и в конце скрипта? и за счет чего она дает прирост(кажется буферизует, да?) а так все отлично, спасибо большое!
     
  9. tanir

    tanir Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    6
    Симпатии:
    0
    было 32М, я делал 128М и 256М, но разницы никакой, но мне уже подсказали, а тебе все равно большое спасибо!
     
  10. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Луше весь вывод буферизуй. А потом один раз сбрасывай буфер.
    PHP по умолчанию, не сразу выводит текст, а сначала сохраняет его во временном буфере, который сбрасывается по переполнению. Вот этот скачок времени, как раз и происходит в момент сброса буфера. Если же мы используем буферезацию (ob_start()) то PHP будет сохранять данные в буфере, пока мы их сами оттуда не достанем. Выходит, что буфер сбрасывается только один раз. Отсюда и прирост.
    Пожалуйста.
     
  11. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    print ob_get_clean();

    Лучше так:

    ob_end_flush();