Вернуться   Форум SAPE.RU > Система SAPE.ru > Вопросы по работе системы

-->
Ответ
 
Опции темы
Старый 10.08.2008, 22:15   #1
Специалист
 
Аватар для RXL
 
Регистрация: 01.11.2007
Адрес: Гондурас
Сообщений: 224
Вес репутации: 205
RXL скоро станет известенRXL скоро станет известен
Arrow Доработка модуля sape: поддержка кеширования в памяти.

Думаю, что сайтам с хорошим посещением и/или с большими базами 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кБ. На счет скорости: субъективно - быстрее, замеры пока не делал.
Вложения
Тип файла: zip sape.zip (6.5 Кб, 2 просмотров)
RXL вне форума   Ответить с цитированием
Старый 10.08.2008, 22:24   #2
Специалист
 
Аватар для RXL
 
Регистрация: 01.11.2007
Адрес: Гондурас
Сообщений: 224
Вес репутации: 205
RXL скоро станет известенRXL скоро станет известен
По умолчанию

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

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);
        }
Вложения
Тип файла: zip sape.zip (6.5 Кб, 2 просмотров)
RXL вне форума   Ответить с цитированием
Старый 10.08.2008, 22:42   #3
Специалист
 
Аватар для RXL
 
Регистрация: 01.11.2007
Адрес: Гондурас
Сообщений: 224
Вес репутации: 205
RXL скоро станет известенRXL скоро станет известен
По умолчанию

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

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;
                        }
RXL вне форума   Ответить с цитированием
Старый 10.08.2008, 23:46   #4
Администратор
 
Регистрация: 22.11.2006
Сообщений: 5,868
Вес репутации: 21475165
Avelon - репутация неоспоримаAvelon - репутация неоспоримаAvelon - репутация неоспоримаAvelon - репутация неоспоримаAvelon - репутация неоспоримаAvelon - репутация неоспоримаAvelon - репутация неоспоримаAvelon - репутация неоспоримаAvelon - репутация неоспоримаAvelon - репутация неоспоримаAvelon - репутация неоспорима
По умолчанию

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

а то опять не оберемся жалоб в техподдержку
Avelon вне форума   Ответить с цитированием
Старый 11.08.2008, 00:51   #5
Специалист
 
Аватар для RXL
 
Регистрация: 01.11.2007
Адрес: Гондурас
Сообщений: 224
Вес репутации: 205
RXL скоро станет известенRXL скоро станет известен
По умолчанию

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

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

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

Померил производительность. Сделал по 20 выборок с кешированием и без. Все в секундах. Среднее время (участок кода п.5.3.) составило 0.001778 и 0.000222 соответственно. Абсолютная разница не велика - всего 0.001556, а относительная - ~87.5%.
Если ссылок мало или время работы скрипта сайта велико, то разница будет неощутима. Для примера, для первой страницы моего сайта разница составила 30%.
Вложения
Тип файла: zip sape.zip (6.5 Кб, 4 просмотров)
RXL вне форума   Ответить с цитированием
Старый 11.08.2008, 00:57   #6
Мастер
 
Аватар для awe
 
Регистрация: 13.11.2007
Адрес: понаехал тут...
Сообщений: 926
Вес репутации: 256
awe - прекрасное будущееawe - прекрасное будущееawe - прекрасное будущееawe - прекрасное будущееawe - прекрасное будущееawe - прекрасное будущееawe - прекрасное будущееawe - прекрасное будущееawe - прекрасное будущееawe - прекрасное будущееawe - прекрасное будущее
По умолчанию

Это дело можно будет ставить на WordPress?
__________________
Ребята, давайте жить дружно!
awe вне форума   Ответить с цитированием
Старый 11.08.2008, 01:48   #7
Особый статус
 
Регистрация: 23.03.2008
Адрес: localhost
Сообщений: 2,594
Вес репутации: 322
Ufaweb - прекрасное будущееUfaweb - прекрасное будущееUfaweb - прекрасное будущееUfaweb - прекрасное будущееUfaweb - прекрасное будущееUfaweb - прекрасное будущееUfaweb - прекрасное будущееUfaweb - прекрасное будущееUfaweb - прекрасное будущееUfaweb - прекрасное будущееUfaweb - прекрасное будущее
Отправить сообщение для Ufaweb с помощью ICQ
По умолчанию

Цитата:
Сообщение от awe Посмотреть сообщение
Это дело можно будет ставить на WordPress?
Наплыв читателей?)
Ufaweb вне форума   Ответить с цитированием
Старый 11.08.2008, 02:00   #8
Специалист
 
Аватар для RXL
 
Регистрация: 01.11.2007
Адрес: Гондурас
Сообщений: 224
Вес репутации: 205
RXL скоро станет известенRXL скоро станет известен
По умолчанию

Цитата:
Сообщение от awe Посмотреть сообщение
Это дело можно будет ставить на WordPress?
От движка сайта не зависит.

Я бы не рекомендовал спешить и ставить. А вот если кто возьмется потестить - было бы хорошо.
RXL вне форума   Ответить с цитированием
Старый 11.08.2008, 11:14   #9
Ваnnеd
 
Аватар для V!rus
 
Регистрация: 07.07.2007
Адрес: нет? :) Танцысбубном: да
Сообщений: 1,967
Вес репутации: 278
V!rus - прекрасное будущееV!rus - прекрасное будущееV!rus - прекрасное будущееV!rus - прекрасное будущееV!rus - прекрасное будущееV!rus - прекрасное будущееV!rus - прекрасное будущееV!rus - прекрасное будущееV!rus - прекрасное будущееV!rus - прекрасное будущееV!rus - прекрасное будущее
Отправить сообщение для V!rus с помощью ICQ
По умолчанию

Цитата:
Сообщение от RXL Посмотреть сообщение
Я бы не рекомендовал спешить и ставить. А вот если кто возьмется потестить - было бы хорошо.
ладно, поставлю на посещаемый ресурс, отпишусь вечером

Добавлено через 20 минут
ну вот промежуточные результаты. Тест на ДЛЕ:
обычная версия скрипта
Цитата:
<!-- Время выполнения скрипта: 0.04207 -->
удаляем линкс.дб и вордс.дб
Цитата:
<!-- Время выполнения скрипта: 25.49599 -->
улучшенная версия скрипта
Цитата:
<!-- Время выполнения скрипта: 0.02439 -->
удаляем линкс.дб и вордс.дб
Цитата:
<!-- Время выполнения скрипта: 5.88628 -->
конекст (1-ая ссылка) обычная версия скрипта
Цитата:
<!-- Время выполнения скрипта: 0.12428 -->
удаляем ликс.дб и вордс.дб
Цитата:
<!-- Время выполнения скрипта: 0.50261 -->
контекст (та же ссылка) улучшенный код
Цитата:
<!-- Время выполнения скрипта: 0.0639 -->
удаляем вордс.дб и линкс.дб
Цитата:
<!-- Время выполнения скрипта: 1.84274 -->
проверить на еррор смогу только вечером.
__________________
Помогаю рефералам.
Осуществляю поддержку сайтов с OpenCart, Bitrix, Wordpress, DLE, Drupal, WebAsyst и пр. Скайп agriboed

Последний раз редактировалось V!rus; 11.08.2008 в 11:14. Причина: Добавлено сообщение
V!rus вне форума   Ответить с цитированием
Старый 11.08.2008, 13:03   #10
Специалист
 
Аватар для RXL
 
Регистрация: 01.11.2007
Адрес: Гондурас
Сообщений: 224
Вес репутации: 205
RXL скоро станет известенRXL скоро станет известен
По умолчанию

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поддержка :( nick11 Вопросы по работе системы 32 13.07.2009 23:14
cmsimple требуется доработка. NCom Деловое сотрудничество 8 28.06.2008 13:45
Тестирование модуля Drupal files32 Контекстные ссылки и все, что с ними связано 8 09.02.2008 00:06
Работа с phpbb 2.0.**, Установка модов / Доработка шаблона Kater Деловое сотрудничество 0 30.10.2007 13:27
Доработка IPB v1.3 Final Kater Курилка 1 15.08.2007 14:07


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