10.08.2008, 22:15 | #1 |
Специалист
Регистрация: 01.11.2007
Адрес: Гондурас
Сообщений: 224
Вес репутации: 211
|
Доработка модуля sape: поддержка кеширования в памяти.
Думаю, что сайтам с хорошим посещением и/или с большими базами links.db или words.db будет полезна возможность кеширования этих баз в памяти. Естественно, на сервере сайта должна стоять какая-нибудь система кеширования.
Я взял последнюю версию модуля сапы для PHP (1.0.4) и сделал в ней ряд изменений. Пока есть поддержка только eAccelerator, но можно добавить и другие. Сейчас расскажу в деталях. Если кому не интересно описание - тяните файл из атача или просто закройте тему. Внесенные изменения: 1. Новые члены класса SAPE_base. Код:
var $_db_name = 'dummy'; // Имя, назначаемое конструктором класса-потомка var $_cache_type = 'none'; Код:
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(); } Код:
function _get_db_name() { return (($this->_multi_site) ? $this->_host . '.' : '') . $this->_db_name; } function _get_db_file() { return dirname(__FILE__) . '/' . $this->_get_db_name(); } Код:
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.1. Код:
function load_data() { $this->_db_file = $this->_get_db_file(); $ttl = $this->_cache_lifetime; // <<< Новое Код:
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; // <<< Новое Было: Код:
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); } Код:
// Проверка поддержки кеш-систем $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; } Систему по тестил только с обычными ссылками - контекст не проверял, но, по логике, с ним тоже должно работать, т.к. методы загрузки у них одни. Работает третьи сутки и проблем не замечено. Размер файла links.db - 190кБ. На счет скорости: субъективно - быстрее, замеры пока не делал.
__________________
* Портал программистов * Клуб программистов |
10.08.2008, 22:24 | #2 |
Специалист
Регистрация: 01.11.2007
Адрес: Гондурас
Сообщений: 224
Вес репутации: 211
|
Дико извиняюсь: не тот файл в атаче!
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); }
__________________
* Портал программистов * Клуб программистов |
10.08.2008, 22:42 | #3 |
Специалист
Регистрация: 01.11.2007
Адрес: Гондурас
Сообщений: 224
Вес репутации: 211
|
Еще можно добавить:
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; }
__________________
* Портал программистов * Клуб программистов |
11.08.2008, 00:51 | #5 |
Специалист
Регистрация: 01.11.2007
Адрес: Гондурас
Сообщений: 224
Вес репутации: 211
|
В алгоритме предусмотрено автоопределение наличия акселератора: если его нет или отключен, то автоматом будет, как прежде, читаться из файла.
Скажем так: я еще неделю потестирую - посмотрю не будет ли ерроров и прочих трабл, пошлифую код, а потом отпишу. В атаче версия последняя версия. Померил производительность. Сделал по 20 выборок с кешированием и без. Все в секундах. Среднее время (участок кода п.5.3.) составило 0.001778 и 0.000222 соответственно. Абсолютная разница не велика - всего 0.001556, а относительная - ~87.5%. Если ссылок мало или время работы скрипта сайта велико, то разница будет неощутима. Для примера, для первой страницы моего сайта разница составила 30%.
__________________
* Портал программистов * Клуб программистов |
11.08.2008, 02:00 | #8 |
Специалист
Регистрация: 01.11.2007
Адрес: Гондурас
Сообщений: 224
Вес репутации: 211
|
От движка сайта не зависит.
Я бы не рекомендовал спешить и ставить. А вот если кто возьмется потестить - было бы хорошо.
__________________
* Портал программистов * Клуб программистов |
11.08.2008, 11:14 | #9 | |||||||||
Ваnnеd
|
Цитата:
Добавлено через 20 минут ну вот промежуточные результаты. Тест на ДЛЕ: обычная версия скрипта Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
__________________
Осуществляю поддержку сайтов с OpenCart, Bitrix, Wordpress, DLE, Drupal, WebAsyst и пр. Скайп agriboed Последний раз редактировалось V!rus; 11.08.2008 в 11:14. Причина: Добавлено сообщение |
|||||||||
11.08.2008, 13:03 | #10 | |
Специалист
Регистрация: 01.11.2007
Адрес: Гондурас
Сообщений: 224
Вес репутации: 211
|
Цитата:
__________________
* Портал программистов * Клуб программистов |
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Поддержка :( | 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, время: 02:47.