7 убийц производительности WordPress
-
Upload
konstantin-kovshenin -
Category
Presentations & Public Speaking
-
view
1.126 -
download
5
Transcript of 7 убийц производительности WordPress
7 убийцпроизводительностиWordPressКонстантин Ковшенин
session_start() 1
Set-Cookie: PHPSESSID=hash
Hash — уникальное значение для каждого посетителя.
session_set_save_handler()
Позволяет использовать произвольный механизм для хранения сессий, напримерRedis или MySQL.
Cookies + JS + AJAX
rand() 2
script.js?v=rand()
Браузер не может использовать файл из кэша если адрес будет каждый раз меняться.
Где 20150815 дата последнего изменения файла, или инкрементируемое число.Можно также использовать mtime().
script.js?v=20150815
Как правило полное сканирование всей таблицы, часто с использованием временных таблиц на диске.
ORDER BY RAND()
Не попадают под кэш запросов MySQL.
RAND(), NOW(),UNIX_TIMESTAMP()
SELECT ID FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' AND post_date >= '2015-06-15' LIMIT 50;
$p = my_get_posts_from_cache();$p = shuffle( $p ); // RAND()$p = array_slice( $p, 0, 10 );
При необходимости кэшируйте в PHP.
SELECT * FROM wp_posts WHERE ID >=( SELECT FLOOR(( MAX(ID) - MIN(ID) + 1 ) * RAND()) + MIN(ID) FROM wp_posts ) LIMIT 1;
wp_cron() 3
Отключить запуск Cron по умолчанию можно с помощью директивы DISABLE_WP_CRON.
/etc/cron.d/wp-cron*/15 * * * * user php wp-cron.php
wp_options 4
Сколько запросов в MySQL?
get_option( 'home' );get_option( 'home' );get_option( 'home' );
get_option( 'home' );get_option( 'home' );get_option( 'home' );
Сколько запросов в MySQL?Ответ: 0.
wp_load_alloptions()
Одним запросом загружает все опции с флагом autoload в кэш объектов (память).
CREATE TABLE wp_options ( option_id bigint(20), option_name varchar(64), option_value longtext, autoload varchar(20),);
SELECT option_name, LENGTH(option_value) FROM wp_options WHERE autoload = 'yes';
add_option( $name, $value $deprecated, $autoload );
$autoload — должна ли опция загружаться автоматически: yes/no.
meta_query 5
CREATE TABLE wp_postmeta ( meta_id bigint(20), post_id bigint(20), meta_key varchar(255), meta_value longtext,);
CREATE INDEX meta_value ON wp_postmeta(meta_value(16));
CREATE INDEX meta_key_value ON wp_postmeta( meta_key, meta_value(16) );
EXPLAIN SELECT * FROM wp_postmeta WHERE meta_key = 'foo' AND meta_value LIKE '%bar%';
Elasticsearch
Очень быстрый сервер для индексации и поиска с учетом морфологии, опечаток и т.д. Хорошо работает с плагином ElasticPress.
wp_remote_* 6
function my_get_weather( $city ) { $weather = wp_remote_get( ... ); return $weather;}
function my_get_weather( $city ) { $key = md5( 'weather-' . $city ); if ( $cache = get_transient( $key ) ) return $cache;
$weather = wp_remote_get( ... ); set_transient( $key, $weather, 3600 ); return $weather;}
TLC Transients
Транзитный кэш с фоновым обновлением.
*.conf 7
nginx.conf
worker_processeskeepalive_*gzipexpires
php-fpm.conf
pm = static/dynamic/ondemandpm.max_childrenlisten.backlog
my.cnf
innodb_buffer_pool_sizequery_cache_sizemax_connections
Кэшируемость
Насколько эффективными являются использованные методы кэширования.
ab, siege
Симулируют активность на сайте, позволяют измерить максимальное количество запросов в секунду. См. также loader.io.
xhprof, xdebug
Инструменты для профилирования PHP кода, позволяют найти самые медленные функции.
log_slow_queries
Позволяет найти медленные запросы в MySQL. См. также mysqlreport, mysqltuner.pl
iperf, fio
Измерение скорости передачи данных по сети, скорости чтения/записи на диск.См. также iotop, iftop.
kovshenin.com/wcrus2015