Форум SAPE.RU

Форум SAPE.RU (http://forum.sape.ru/index.php)
-   Вопросы по работе системы (http://forum.sape.ru/forumdisplay.php?f=13)
-   -   Доработка модуля sape: поддержка кеширования в памяти. (http://forum.sape.ru/showthread.php?t=16409)

RXL 10.08.2008 22:15

Доработка модуля sape: поддержка кеширования в памяти.
 
Вложений: 1
Думаю, что сайтам с хорошим посещением и/или с большими базами links.db или words.db будет полезна возможность кеширования этих баз в памяти. Естественно, на сервере сайта должна стоять какая-нибудь система кеширования.

Я взял последнюю версию модуля сапы для PHP (1.0.4) и сделал в ней ряд изменений. Пока есть поддержка только eAccelerator, но можно добавить и другие. Сейчас расскажу в деталях. Если кому не интересно описание - тяните файл из атача или просто закройте тему.

Внесенные изменения:

1. Новые члены класса SAPE_base.
Код:

    var $_db_name          = 'dummy';          // Имя, назначаемое конструктором класса-потомка

    var $_cache_type        = 'none';

2. Измененные конструкторы классов SAPE_client и SAPE_contex.
Код:

    function SAPE_client($options = null) {
        parent::SAPE_base($options);
        $this->_db_name = 'links.db'; // <<< Новое
        $this->load_data();
    }

    function SAPE_context($options = null) {
        parent::SAPE_base($options);
        $this->_db_name = 'words.db'; // <<< Новое
        $this->load_data();
    }

3. Метод _get_db_file вынесен из классов SAPE_client и SAPE_contex в базовый SAPE_base и в него же добавлен метод _get_db_name. Метод _get_db_name потребуется для создания ключа в кеш-системе.
Код:

    function _get_db_name() {
        return (($this->_multi_site) ? $this->_host . '.' : '') . $this->_db_name;
    }

    function _get_db_file() {
        return dirname(__FILE__) . '/' . $this->_get_db_name();
    }

4. Новые методы класса SAPE_base для работы с кеш-системами.
Код:

    function _get_cache() {
        $key = 'sape-' . $this->_get_db_name();
        $data = null;

        switch ($this->_cache_type)
        {
            case 'none':
                break;
            case 'eaccelerator':
                $data = eaccelerator_get($key);
                break;
        }

        return $data;
    }

    function _put_cache(&$data, $ttl) {
        $key = 'sape-' . $this->_get_db_name();

        switch ($this->_cache_type)
        {
            case 'none':
                break;
            case 'eaccelerator':
                eaccelerator_put($key, $data, $ttl);
                break;
        }
    }

5. Изменения в методе load_data - работа с кешированием.

5.1.
Код:

    function load_data() {
        $this->_db_file = $this->_get_db_file();
        $ttl = $this->_cache_lifetime; // <<< Новое

5.2.
Код:

        if (filemtime($this->_db_file) < (time()-$this->_cache_lifetime) || filesize($this->_db_file) == 0) {

            // Чтобы не повесить площадку клиента и чтобы не было одновременных запросов
            @touch($this->_db_file, (time() - $this->_cache_lifetime + $this->_cache_reloadtime));
            $ttl = $this->_cache_reloadtime; // <<< Новое

5.3.
Было:
Код:

        if ($data = $this->_read($this->_db_file)) {
            $this->set_data(@unserialize($data));
        }

Стало:
Код:

        if ($data = $this->_get_cache())
            $this->set_data($data);
        else if ($data = $this->_read($this->_db_file)) {
            $this->set_data(@unserialize($data));
            $this->_put_cache($this->_links, $ttl);
        }

6. Добавлен код в конец конструктора SAPE_base. Настройка системы.
Код:

        // Проверка поддержки кеш-систем
        $cache_systems = array();

        if (function_exists('eaccelerator_get'))
            $cache_systems[] = 'eaccelerator';

        $required_cache = isset($options['cache']) ? $options['cache'] : 'auto';

        if (count($cache_systems))
        {
            if ($required_cache == 'auto')
            {
                $this->_cache_type = array_shift($cache_systems); // первое значение в списке
            }
            else if (in_array($required_cache, $cache_systems))
                $this->_cache_type = $required_cache;
        }

Собственно, пункты 4 и 6 ответственны за поддержку кеш-систем.

Систему по тестил только с обычными ссылками - контекст не проверял, но, по логике, с ним тоже должно работать, т.к. методы загрузки у них одни. Работает третьи сутки и проблем не замечено. Размер файла links.db - 190кБ. На счет скорости: субъективно - быстрее, замеры пока не делал.

RXL 10.08.2008 22:24

Вложений: 1
Дико извиняюсь: не тот файл в атаче!

5.3.
Было:
Код:

        if ($data = $this->_read($this->_db_file)) {
            $this->set_data(@unserialize($data));
        }

Стало:
Код:

        if ($data = $this->_get_cache())
            $this->set_data($data);
        else if ($data = $this->_read($this->_db_file)) {
            $data = @unserialize($data);
            $this->set_data();
            $this->_put_cache($data, $ttl);
        }


RXL 10.08.2008 22:42

Еще можно добавить:

7. Перезаливка кеша в случае обновления файла (метод load_data).

Было:
Код:

                        // [псевдо]проверка целостности:
                        if (@unserialize($data) != false) {
                            $this->_write($this->_db_file, $data);
                            break;
                        }

Стало:
Код:

                        // [псевдо]проверка целостности:
                        $data2 = @unserialize($data);
                        if ($data2 != false) {
                            $this->_write($this->_db_file, $data);
                            $ttl = $this->_cache_lifetime;
                            $this->_put_cache($data2, $ttl);
                            break;
                        }


Avelon 10.08.2008 23:46

спасибо, но будет ли это универсально?

а то опять не оберемся жалоб в техподдержку

RXL 11.08.2008 00:51

Вложений: 1
В алгоритме предусмотрено автоопределение наличия акселератора: если его нет или отключен, то автоматом будет, как прежде, читаться из файла.

Скажем так: я еще неделю потестирую - посмотрю не будет ли ерроров и прочих трабл, пошлифую код, а потом отпишу.

В атаче версия последняя версия.

Померил производительность. Сделал по 20 выборок с кешированием и без. Все в секундах. Среднее время (участок кода п.5.3.) составило 0.001778 и 0.000222 соответственно. Абсолютная разница не велика - всего 0.001556, а относительная - ~87.5%.
Если ссылок мало или время работы скрипта сайта велико, то разница будет неощутима. Для примера, для первой страницы моего сайта разница составила 30%.

awe 11.08.2008 00:57

Это дело можно будет ставить на WordPress?

Ufaweb 11.08.2008 01:48

Цитата:

Сообщение от awe (Сообщение 211780)
Это дело можно будет ставить на WordPress?

Наплыв читателей?) :)

RXL 11.08.2008 02:00

Цитата:

Сообщение от awe (Сообщение 211780)
Это дело можно будет ставить на WordPress?

От движка сайта не зависит.

Я бы не рекомендовал спешить и ставить. А вот если кто возьмется потестить - было бы хорошо.

V!rus 11.08.2008 11:14

Цитата:

Сообщение от RXL (Сообщение 211796)
Я бы не рекомендовал спешить и ставить. А вот если кто возьмется потестить - было бы хорошо.

ладно, поставлю на посещаемый ресурс, отпишусь вечером

Добавлено через 20 минут
ну вот промежуточные результаты. Тест на ДЛЕ:
обычная версия скрипта
Цитата:

<!-- Время выполнения скрипта: 0.04207 -->
удаляем линкс.дб и вордс.дб
Цитата:

<!-- Время выполнения скрипта: 25.49599 -->
улучшенная версия скрипта
Цитата:

<!-- Время выполнения скрипта: 0.02439 -->
удаляем линкс.дб и вордс.дб
Цитата:

<!-- Время выполнения скрипта: 5.88628 -->
конекст (1-ая ссылка) обычная версия скрипта
Цитата:

<!-- Время выполнения скрипта: 0.12428 -->
удаляем ликс.дб и вордс.дб
Цитата:

<!-- Время выполнения скрипта: 0.50261 -->
контекст (та же ссылка) улучшенный код
Цитата:

<!-- Время выполнения скрипта: 0.0639 -->
удаляем вордс.дб и линкс.дб
Цитата:

<!-- Время выполнения скрипта: 1.84274 -->
проверить на еррор смогу только вечером.

RXL 11.08.2008 13:03

Цитата:

удаляем ликс.дб и вордс.дб
Это можно не замерять - львиная доля времени там тратиться на коммуникации с сервером Сапы.


Часовой пояс GMT +3, время: 19:41.

Работает на vBulletin® версия 3.8.7.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
SAPE.RU — система купли-продажи ссылок с главных и внутренних страниц сайтов.