Еще одна оптимизация NextGen Gallery

Минус один UPDATE при каждом обращении к блогу

Плагин имеет одну неприятную особенность: при каждом обращении к блогу выполняется обновление (UPDATE в терминах MySQL) таблицы wp_options. Хотя для «средних» блогов это не критично, для хорошо посещаемых ресурсов это плохо по ряду причин:

  1. Обновление таблицы wp_options сбрасывает кэш запросов MySQL к таблице wp_options, что приводит к необходимости реального выполнения запросов на выборку данных (с учётом огромного количества записей — благодаря всяким разным плагинам — это лишний трафик между PHP и MySQL).
  2. Выполнение операции обновления таблицы при использовании MyISAM приводит к блокировке таблицы; при высокой посещаемости это приводит к вынужденному ожиданию освобождения таблицы и негативно сказывается на нагрузке и производительности.
  3. При использовании плагинов объектного кэширования каждый вызов update_option() приводит к необходимости обновления и записи кэша; обновление файлового объектного кэша приводит к лишним обращениям к диску (которых на виртуальных серверах лучше избегать).
  4. В конце концов, это лишний запрос, который не является необходимым.

Использование плагина MySQL Monitor показывает:

  • Запрос:
    [-]
    View Code MySQL
    UPDATE `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 Text
    wp-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)

Говоря простым языком, при каждой загрузке регистрирует функцию деинсталляции плагина. Таким образом, если мы имеем 25,000 показов страниц в день, это выливается в 25,000 (относительно медленных) запросов UPDATE к базе.

Проблема решается очень просто: вызов функции register_uninstall_hook переносится из конструктора nggLoader::nggLoader() (файл nextgen-gallery/nggallery.php) в самый конец функции nggLoader::activate() (за строку delete_option( 'ngg_update_exists' );).

Получаем простой патч:

[-]
--- nggallery.php.old   2009-11-23 22:06:09.000000000 +0200
+++ 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, оптимизация, патч, плагин
23
Ноя
2009

RSS Комментарии к статье «Еще одна оптимизация NextGen Gallery» (18)

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

Извините, комментарии закрыты.