PandoraBox
02.02.2008, 02:44
В этой статье будет рассказано об ускорении работы сайта (и web-инфосистемы в целом). Огромную систему сайта можно разбить на участки исполняемого кода и оптимизировать каждый участок по-отдельности, наблюдая за затраченным временем.
Хороший фундамент платформы Проверяйте что творится с памятью - большие объектные движки любят загружать память объектами, которые не используются оптимально в показе страницы. В помощь print_r($GLOBALS); Оптимизация кода дело программиста, а для ускорения компиляции можно использовать ionCube PHPA (http://www.php-accelerator.co.uk/), eAccelerator (http://www.eaccelerator.net/), Zend encoder (http://www.zend.com/products/zend_safeguard) , Turckl mmcache (http://freshmeat.net/projects/turck-mmcache/).
Оптимизация работы с БД Уменьшение числа запросов. Сложные структуры (типа меню) выгодней хранить в сессии, загружая переменные только один раз из БД, это ускоряет загрузку сайта в разы.
На php имеет смысл (http://www.johnjawed.com/benchmarks/) перейти на использование функций mysqli (http://us3.php.net/manual/en/ref.mysqli.php), вместо mysql и использовать подготовленные запросы
Обязательное индексирование ключей и выборка только необходимых данных (вместо SELECT * FROM..)
Оптимизация запросов благодаря их исследованию (http://www.databasejournal.com/features/mysql/article.php/10897_1382791_1), устанавливая
EXPLAIN в начале. Всё гениальное просто.
Изучайте дополнительные возможности, уменьшающие конструкции, например INSERT .. ON DUPLICATE UPDATE; REPLACE;
Использование кэширования в MySql, если его ещё нет SHOW VARIABLES LIKE '%query_cache%'; Для очень популярных сайтов имеет смысл пересмотреть кэширование mysql на другом уровне и использовать memcached. Кластеры вам в помощь.
Кэширование темплейтов. Темплейты Smarty проходят два процесса - компиляция и кэширование. При компиляции созданный темплейт превращается в php файл. При кэшировании вся страница с данными сохраняется в файл отдельно.
Как правило для разных сайтов используется всё же один общий template,что-бы его кэшировать в разных версиях, надо использовать дополнительный ID (http://smarty.php.net/manual/ru/caching.multiple.caches.php)
Правильная оптимизация http-выхода. Читаем Browser Cache usage (http://yuiblog.com/blog/2007/01/04/performance-research-part-2/). Для тестирования используем firebug (http://www.getfirebug.com/) или pingdom tools (http://tools.pingdom.com/fpt/) Javascript, css лучше складывать в один или пару больших файлов, чем в десяток мелких, даже для изображений если вы используете множество иконок, имеет смысл поместить их в один файл и используя css background-position вырезать из большого файла нужную иконку. Увеличение параллельности загрузки объектов за счёт использования нескольких доменных имён (http://www.die.net/musings/page_load_time/). Так images.amazon.com хороший пример. В Opera впрочем такого ограничения нет, в отличие от IE с 2мя потоками на домен.
gzip-сжатие (http://users.livejournal.com/_arty/217492.html) страниц сомнительно что поможет, потому что на распаковку всё же время тоже тратится, а если ещё и сжатие происходит на лету, то и на сжатие время тратится, а что быстрей - передать чуть больше данных или сжимать и разжимать - сложный вопрос.
Замеряем время исполнения:
Функция для отметок сколько по времени часть кода исполняется
$arrTime=array();
function timestep($strStep){
global $arrTime;
$time_start = microtime();
$time_start = explode(' ', $time_start);
$time_start = $time_start[1] + $time_start[0];
if (count($arrTime)>0)
$arrTime[]=array('step'=>$strStep,'execution'=>$time_start- $arrTime[count($arrTime)-1]['timestamp'], 'timestamp'=>$time_start);
else $arrTime[]=array('step'=>$strStep,'execution'=>0, 'timestamp'=>$time_start);
}Для исполнение просто вызываем функцию в нужных участках кода с параметром названия этого участка, а в конце кода просто смотрим что в массиве $arrTime творится.
Хороший фундамент платформы Проверяйте что творится с памятью - большие объектные движки любят загружать память объектами, которые не используются оптимально в показе страницы. В помощь print_r($GLOBALS); Оптимизация кода дело программиста, а для ускорения компиляции можно использовать ionCube PHPA (http://www.php-accelerator.co.uk/), eAccelerator (http://www.eaccelerator.net/), Zend encoder (http://www.zend.com/products/zend_safeguard) , Turckl mmcache (http://freshmeat.net/projects/turck-mmcache/).
Оптимизация работы с БД Уменьшение числа запросов. Сложные структуры (типа меню) выгодней хранить в сессии, загружая переменные только один раз из БД, это ускоряет загрузку сайта в разы.
На php имеет смысл (http://www.johnjawed.com/benchmarks/) перейти на использование функций mysqli (http://us3.php.net/manual/en/ref.mysqli.php), вместо mysql и использовать подготовленные запросы
Обязательное индексирование ключей и выборка только необходимых данных (вместо SELECT * FROM..)
Оптимизация запросов благодаря их исследованию (http://www.databasejournal.com/features/mysql/article.php/10897_1382791_1), устанавливая
EXPLAIN в начале. Всё гениальное просто.
Изучайте дополнительные возможности, уменьшающие конструкции, например INSERT .. ON DUPLICATE UPDATE; REPLACE;
Использование кэширования в MySql, если его ещё нет SHOW VARIABLES LIKE '%query_cache%'; Для очень популярных сайтов имеет смысл пересмотреть кэширование mysql на другом уровне и использовать memcached. Кластеры вам в помощь.
Кэширование темплейтов. Темплейты Smarty проходят два процесса - компиляция и кэширование. При компиляции созданный темплейт превращается в php файл. При кэшировании вся страница с данными сохраняется в файл отдельно.
Как правило для разных сайтов используется всё же один общий template,что-бы его кэшировать в разных версиях, надо использовать дополнительный ID (http://smarty.php.net/manual/ru/caching.multiple.caches.php)
Правильная оптимизация http-выхода. Читаем Browser Cache usage (http://yuiblog.com/blog/2007/01/04/performance-research-part-2/). Для тестирования используем firebug (http://www.getfirebug.com/) или pingdom tools (http://tools.pingdom.com/fpt/) Javascript, css лучше складывать в один или пару больших файлов, чем в десяток мелких, даже для изображений если вы используете множество иконок, имеет смысл поместить их в один файл и используя css background-position вырезать из большого файла нужную иконку. Увеличение параллельности загрузки объектов за счёт использования нескольких доменных имён (http://www.die.net/musings/page_load_time/). Так images.amazon.com хороший пример. В Opera впрочем такого ограничения нет, в отличие от IE с 2мя потоками на домен.
gzip-сжатие (http://users.livejournal.com/_arty/217492.html) страниц сомнительно что поможет, потому что на распаковку всё же время тоже тратится, а если ещё и сжатие происходит на лету, то и на сжатие время тратится, а что быстрей - передать чуть больше данных или сжимать и разжимать - сложный вопрос.
Замеряем время исполнения:
Функция для отметок сколько по времени часть кода исполняется
$arrTime=array();
function timestep($strStep){
global $arrTime;
$time_start = microtime();
$time_start = explode(' ', $time_start);
$time_start = $time_start[1] + $time_start[0];
if (count($arrTime)>0)
$arrTime[]=array('step'=>$strStep,'execution'=>$time_start- $arrTime[count($arrTime)-1]['timestamp'], 'timestamp'=>$time_start);
else $arrTime[]=array('step'=>$strStep,'execution'=>0, 'timestamp'=>$time_start);
}Для исполнение просто вызываем функцию в нужных участках кода с параметром названия этого участка, а в конце кода просто смотрим что в массиве $arrTime творится.