Еще одна оптимизация NextGen Gallery
Минус один UPDATE при каждом обращении к блогу
Плагин NextGen Gallery имеет одну неприятную особенность: при каждом обращении к блогу выполняется обновление (UPDATE в терминах MySQL) таблицы wp_options. Хотя для «средних» блогов это не критично, для хорошо посещаемых ресурсов это плохо по ряду причин:
- Обновление таблицы
wp_optionsсбрасывает кэш запросов MySQL к таблицеwp_options, что приводит к необходимости реального выполнения запросов на выборку данных (с учётом огромного количества записей — благодаря всяким разным плагинам — это лишний трафик между PHP и MySQL). - Выполнение операции обновления таблицы при использовании MyISAM приводит к блокировке таблицы; при высокой посещаемости это приводит к вынужденному ожиданию освобождения таблицы и негативно сказывается на нагрузке и производительности.
- При использовании плагинов объектного кэширования каждый вызов
update_option()приводит к необходимости обновления и записи кэша; обновление файлового объектного кэша приводит к лишним обращениям к диску (которых на виртуальных серверах лучше избегать). - В конце концов, это лишний запрос, который не является необходимым.
Использование плагина MySQL Monitor показывает:
- Запрос:
[-]View Code MySQLUPDATE `wp_options` SET `option_value` = 'a:3:{i:0;b:0;s:29:\"nextgen-gallery/nggallery.php\";a:2:{i:0;s:9:\"nggLoader\";i:1;s:9:\"uninstall\";}...}' WHERE `option_name` = 'uninstall_plugins'
- Трасса вызовов:
[-]View Code Textwp-includes/wp-db.php, 830 (DbProfile::query)
wp-includes/functions.php, 533 (wpdb::update)
wp-includes/plugin.php, 608 (update_option)
wp-content/plugins/nextgen-gallery/nggallery.php, 80 (register_uninstall_hook)
wp-content/plugins/nextgen-gallery/nggallery.php, 429 (nggLoader::nggLoader)
wp-settings.php, 566 (include_once)
wp-config.php, 84 (require_once)
wp-load.php, 30 (require_once)
wp-blog-header.php, 12 (require_once)
index.php, 17 (require)
Говоря простым языком, NextGen Gallery при каждой загрузке WordPress регистрирует функцию деинсталляции плагина. Таким образом, если мы имеем 25,000 показов страниц в день, это выливается в 25,000 (относительно медленных) запросов UPDATE к базе.
Проблема решается очень просто: вызов функции register_uninstall_hook переносится из конструктора nggLoader::nggLoader() (файл nextgen-gallery/nggallery.php) в самый конец функции nggLoader::activate() (за строку delete_option( 'ngg_update_exists' );).
Получаем простой патч:
+++ nggallery.php 2009-11-23 22:07:55.000000000 +0200
@@ -76,9 +76,6 @@
register_activation_hook( $this->plugin_name, array(&$this, 'activate') );
register_deactivation_hook( $this->plugin_name, array(&$this, 'deactivate') );
- // Register a uninstall hook to remove all tables & option automatic
- register_uninstall_hook( $this->plugin_name, array('nggLoader', 'uninstall') );
-
// Start this plugin once all other plugins are fully loaded
add_action( 'plugins_loaded', array(&$this, 'start_plugin') );
@@ -376,6 +373,8 @@
// remove the update message
delete_option( 'ngg_update_exists' );
+ // Register a uninstall hook to remove all tables & option automatic
+ register_uninstall_hook( $this->plugin_name, array('nggLoader', 'uninstall') );
}
function deactivate() {
Связанные записи
Автор: Vladimir; опубликовано в: Патчи; метки: NextGen Gallery, WordPress, оптимизация, патч, плагинНоя
2009


Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.






Исправлено в NextGEN Gallery 1.5.0.