:)
ajax
Android
api
apple
assembly
authsub
books
c++
crash
cron
deepmemo
english
facebook
faq
favicon
firefox
folk rock
friends
future
games
google
gps
guinness
Hancock
HTC Dream
humor
icq
IE
japan
javascript
jQuery
keyrus
language
linux
livejournal
logo
memcache
microsoft
mozilla
mysql
news
pdf
perl
photoshop
php
politic
python
ruby
serial
session
startup
tidy
vkontakte.ru
web 2.0
windows
xdebug
xml
xmlrpc
xul
zend
азбука
анекдот
архитектура
БАК
безопасность
Билл Гейтс
Днепропетровск
жесть
зло
ИИ
инвестиции
картинка
картинки
кеширование
китай
коты
кубики
кэширование
мотивация
новости
о нас пишут
оптимизация
ошибки
позитив
презентация
премия Дарвина
проблема
пролог
Путин
развитие
сплетни
стихотворение
тайна
тестирование
технолигия
Чарли Чаплин
шанс
юмор
Ющенко
:)
"Конкурс"
apple
bash
deepmemo
Google
humor
icamp
Internet Субботник CC
Internet Субботник СС
iphone
javascript
Microsoft
notes
php
windows
www
yahoo
Авто
аренда
афоризмы
Афоризмы и крылатые выражения
банк
безопасность
библиотеки
бизнес
блог
блоги
война
время
высказывания
гений
Грузия
деньги
детектор лжи
дети
Дружба
жесть
жизнь
Житомир
заметки
здоровье
инновации
Интернет
искусство
история
кадры
КАРАИМЫ
картинки
кино
книги
Конкурс
космос
Кризис
культура
любовь
маркетинг
музыка
Мысли
Наука
новости
Образование
Общество
оружие
персонал
писатель
поиск
политика
ПриватБанк
психология
Путин
работа
реклама
Рон Хаббард
Россия
семья
сервис
смысл жизни
софт
Социальные сети
спорт
стихи
счастье
США
Творчество
технологии
технология
туризм
украина
фото
футбол
цель
цитата
цитаты
цытата
Человек
черномырдизмы
Экономика
эмоции
юмор
|
14:17 27.08.2008
<div class="textheader_h1">Сравнительный тест систем кэширования пользовательских данных для PHP.</div>
<br />
<div style="text-align: left;">Роман Чернышов (<a href="mailto:rxl@mail.ru">rxl@mail.ru</a>)<br />
15.08.2008</div>
<br />
<div style="text-align: justify;">
<div class="textheader_h2">Содержание.</div>
<br />
<ul style="margin-top: 0pt; margin-bottom: 0pt;">
<li><a href="http://club.shelek.ru/viewart.php?id=300#post_p1">Введение.</a></li>
<li><a href="http://club.shelek.ru/viewart.php?id=300#post_p2">Краткий обзор.</a><br />
<ul style="margin-top: 0pt; margin-bottom: 0pt;">
<li><a href="http://club.shelek.ru/viewart.php?id=300#post_p2_1">eAccelerator</a></li>
<li><a href="http://club.shelek.ru/viewart.php?id=300#post_p2_2">APC</a></li>
<li><a href="http://club.shelek.ru/viewart.php?id=300#post_p2_3">XCache</a></li>
<li><a href="http://club.shelek.ru/viewart.php?id=300#post_p2_4">Memcache</a></li>
</ul>
</li>
<li><a href="http://club.shelek.ru/viewart.php?id=300#post_p3">Подготовка к тестам.</a></li>
<li><a href="http://club.shelek.ru/viewart.php?id=300#post_p4">Тесты.</a><br />
<ul style="margin-top: 0pt; margin-bottom: 0pt;">
<li><a href="http://club.shelek.ru/viewart.php?id=300#post_p4_1">Тест первый. Зверский.</a></li>
<li><a href="http://club.shelek.ru/viewart.php?id=300#post_p4_2">Тест второй. Многократное чтение.</a></li>
<li><a href="http://club.shelek.ru/viewart.php?id=300#post_p4_3">Тест третий. В погоне за реальностью.</a></li>
</ul>
</li>
<li><a href="http://club.shelek.ru/viewart.php?id=300#post_p5">Заключение.</a></li>
</ul>
<br />
<span id="post_p1"></span>
<div class="textheader_h2"><span id="post_p1">Введение.</span></div>
<span id="post_p1"><br /></span>
<div class="para"><span id="post_p1">Началось все с того, что захотелось уменьшить время отклика страниц. Не разбираясь особо, я поставил на наш <a href="http://club.shelek.ru/" target="_blank">клубный сервер</a> eAccelerator. Он умеет кэшировать скомпилированные в байт-код php-файлы, имеет оптимизатор кода и позволяет кэшировать пользовательские данные и данные сессий. Время отклика снизилось на разных сайтах в 2-10 раз, в зависимости от внутренней логики движков: которые по проще - страницы просто вылетают, которые по мудренее - немного по быстрее стали работать.</span></div>
<div class="para"><span id="post_p1">Потом в голове возник вопрос: а правильный ли выбор я сделал. Стал искать сравнительные тесты в интернете и ничего стоящего не нашел. Даже странно стало: оптимизаторы php существуют не первый год, а сравнений никто не производил. Даже если кто их и делал, то в поисковых системах они погребены под горами мусора.</span></div>
<div class="para"><span id="post_p1">Рассмотрев список бесплатно доступных систем, составил следующий список: eAccelerator, APC, XCache и Memcache.</span></div>
<div class="para"><span id="post_p1">Первые три умеют кэшировать скомпилированные php-файлы, eAccelerator и APC имеют оптимизаторы кода, Memcache же является отдельным кэширующим сервером и к php имеет отношение только тем, что для работы с ним существует php-модуль.</span></div>
<span id="post_p1"><br />
<span id="post_p2"></span></span>
<div class="textheader_h2"><span id="post_p1">Краткий обзор.</span></div>
<span id="post_p1"><br />
<span id="post_p2_1"></span></span>
<div class="textheader_h3"><span id="post_p1">eAccelerator</span></div>
<span id="post_p1"><br />
<a href="http://bart.eaccelerator.net/doc/phpdoc/" target="_blank" rel="nofollow">http://bart.eaccelerator.net/doc/phpdoc/</a><br /></span>
<div class="para"><span id="post_p1">По API больше понравился eAccelerator. API простое - только самое нужное, но есть и такие возможности, которых нет у других - функции блокировки ключа. Документация неудобная, но информация понятна и есть толковые примеры. Он также лучше и удобнее в настройках. Позволяет отдельно управлять хранением ключей, сессий и данных (скомпилированного кода и пользовательских данных). Методы хранения: только в разделяемой памяти, в памяти и на диске одновременно, в памяти с вытеснением на диск и только на диске. Легко и прозрачно можно отделить ключи каждого виртуального сервера в системе, чтобы не было лишних дырок в безопасности и пересечения ключей, установкой уникального значения параметра <tt>eaccelerator.name_space</tt> для каждого виртуального сервера. Переписал код club.shelek.ru на работу с кэшом: среднее время генерации страницы всего 4-5 мс против 90-120 без кэша. Против ожидания, что нагрузка на процессор и память возрастет, наблюдаю наоборот - снижение за счет меньшей нагрузки на базу данных. Посмотрим, как он покажет себя при длительной эксплуатации.</span></div>
<span id="post_p1"><br />
<span id="post_p2_2"></span></span>
<div class="textheader_h3"><span id="post_p1">APC</span></div>
<span id="post_p1"><br />
<a href="http://www.php.net/apc" target="_blank" rel="nofollow">http://www.php.net/apc</a><br /></span>
<div class="para"><span id="post_p1">APC очень обилен в настройках. Пока я предпочел не крутить настройки и пользоваться значениями по умолчанию. API очень маленькое. Интересная фича - сохранение массива и восстановление его как набора констант. Редкая по нужности фича.</span></div>
<span id="post_p1"><br />
<span id="post_p2_3"></span></span>
<div class="textheader_h3"><span id="post_p1">XCache</span></div>
<span id="post_p1"><br />
<a href="http://xcache.lighttpd.net/wiki/XcacheApi" target="_blank" rel="nofollow">http://xcache.lighttpd.net/wiki/XcacheApi</a><br /></span>
<div class="para"><span id="post_p1">После eAccelrator и APC, XCache ничем хорошим не удивил. Отвратительная документация по API без единого комментария (я назвал ее - "черный квадрат"), хотя для базовых функций даны примеры и то хорошо. API простое. Из особенностей - возможность выполнять инкремент и декремент числового значения в кэше и функция проверки наличия ключа в кэше без пересылки самого значения. Настроек довольно мало. Удивило то, что кэширование, по умолчанию, разрешено, но размер используемой памяти и максимальные размеры пользовательских объектов равны нолю, что по документации означает - "запрещено".</span></div>
<span id="post_p1"><br />
<span id="post_p2_4"></span></span>
<div class="textheader_h3"><span id="post_p1">Memcache</span></div>
<span id="post_p1"><br />
<a href="http://www.php.net/memcache" target="_blank" rel="nofollow">http://www.php.net/memcache</a><br /></span>
<div class="para"><span id="post_p1">Memcache минималистичен в настройках, так как настройки управления кэшированием находятся на стороне сервера memcached. API у него посложнее, чем у первых трех систем, и поддерживает работу в процедурном и ООП способах. Из особенностей: помимо функции установки значения по ключу, есть возможность добавить ключ, только если его еще нет, и перезаписать, только если он уже есть. Может иметь несколько кэширующих серверов: как на том же хосте, так и на других. Как я понял, суть Memcache в использовании ресурсов других хостов. По моему мнению, это несколько устарело: если ресурсов одного хоста не хватает, то лучше найти другой способ распределить нагрузку, чем коммуникация по TCP с кэширующими серверами на других хостах, что вносит существенную задержку. Тем не менее, Memcache в сети упоминается часто, из чего делаю вывод о его популярности и включаю в список тестируемых систем.</span></div>
<span id="post_p1"><br />
<span id="post_p3"></span></span>
<div class="textheader_h2"><span id="post_p1">Подготовка к тестам.</span></div>
<span id="post_p1"><br /></span>
<div class="para"><span id="post_p1">Тестировать все это на живом сервере я не рискнул и использовал виртуальную машину. Все программы, которые могли вызвать неожиданную нагрузку на систему и повлиять на результаты замеров, были остановлены.</span></div>
<div class="para"><span id="post_p1">Условия тестов:</span></div>
<span id="post_p1"><br /></span>
<ul style="margin-top: 0pt; margin-bottom: 0pt;">
<li><span id="post_p1">Хост система: одноядерный P4 2800 ГГц, 1.5 ГБ памяти DDR-400, Windows XP Professional SP2, VMware Workstation 5.5.1.</span></li>
<li><span id="post_p1">Виртуальная система: 512 МБ, Linux CentOS 5.1, Apache 2.2.3, PHP 5.1.6, gcc 4.1.2.</span></li>
</ul>
<span id="post_p1"><br /></span>
<div class="para"><span id="post_p1">Тестируемые программы были собраны на это виртуальном хосте с дополнительным ключом компиляции <tt>-O3</tt>. Для компиляции потребовалось скомпилировать и установить программу re2c версии 0.13.5.</span></div>
<div class="para"><span id="post_p1">Версии программ:</span></div>
<span id="post_p1"><br /></span>
<ul style="margin-top: 0pt; margin-bottom: 0pt;">
<li><span id="post_p1">eAccelerator - 0.9.5.3</span></li>
<li><span id="post_p1">APC - 3.0.19</span></li>
<li><span id="post_p1">XCache - 1.2.2</span></li>
<li><span id="post_p1">Memcache - 3.0.1</span></li>
<li><span id="post_p1">Memcached - 1.2.6</span></li>
</ul>
<span id="post_p1"><br /></span>
<div class="para"><span id="post_p1">Всем кэш-системам было выделено по 64 МБ разделяемой памяти. Оптимизация кода была включена. Перед каждым тестом каждой системы исправлялся конфиг php.ini, чтобы загружалась только тестируемая система, и выполнялся рестарт демона httpd.</span></div>
<div class="para"><span id="post_p1">Лимит времени работы скрипта был убран, память выделяемая процессу - 200МБ (сперва было 16, но об этом чуть позже). Время измерялось php-функцией <tt>microtime(true)</tt> - с точностью до микросекунд.</span></div>
<div class="para"><span id="post_p1">Работу с кэш-системами обеспечивал несколькими днями ранее написанный класс.</span></div>
<span id="post_p1"><br /></span>
<div class="codeheader"><span id="post_p1">Код: (php)</span></div>
<div class="code"><span id="post_p1"></span>
<pre style="margin-top: 0pt; display: inline;" class="code_pre">
<span id="post_p1"><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 187);"><?php<br><br></span><span style="color: rgb(255, 128, 0); ">// (c) 2008 Veselchak U<br><br></span><span style="color: rgb(0, 119, 0); ">class </span><span style="color: rgb(0, 0, 187); ">Cache<br></span><span style="color: rgb(0, 119, 0); ">{<br> var </span><span style="color: rgb(0, 0, 187); ">$_cache_type </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(221, 0, 0); ">'auto'</span><span style="color: rgb(0, 119, 0); ">; </span><span style="color: rgb(255, 128, 0); ">// дефолтное значение<br></span><span style="color: rgb(0, 119, 0); ">var </span><span style="color: rgb(0, 0, 187); ">$_memcache </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">null</span><span style="color: rgb(0, 119, 0); ">;<br><br> function </span><span style="color: rgb(0, 0, 187); ">__constructor</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$options </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">null</span><span style="color: rgb(0, 119, 0); ">)<br> {<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">Cache</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$options</span><span style="color: rgb(0, 119, 0); ">);<br> }<br><br> function </span><span style="color: rgb(0, 0, 187); ">Cache</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$options </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">null</span><span style="color: rgb(0, 119, 0); ">)<br> {<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(255, 128, 0); ">// Проверка поддержки кеш-систем<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$cache_systems </span><span style="color: rgb(0, 119, 0); ">= array();<br><br></span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">function_exists</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(221, 0, 0); ">'eaccelerator_get'</span><span style="color: rgb(0, 119, 0); ">))<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$cache_systems</span><span style="color: rgb(0, 119, 0); ">[] = </span><span style="color: rgb(221, 0, 0); ">'eaccelerator'</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">function_exists</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(221, 0, 0); ">'apc_fetch'</span><span style="color: rgb(0, 119, 0); ">))<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$cache_systems</span><span style="color: rgb(0, 119, 0); ">[] = </span><span style="color: rgb(221, 0, 0); ">'apc'</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">function_exists</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(221, 0, 0); ">'xcache_get'</span><span style="color: rgb(0, 119, 0); ">))<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$cache_systems</span><span style="color: rgb(0, 119, 0); ">[] = </span><span style="color: rgb(221, 0, 0); ">'xcache'</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">class_exists</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(221, 0, 0); ">'Memcache'</span><span style="color: rgb(0, 119, 0); ">))<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$cache_systems</span><span style="color: rgb(0, 119, 0); ">[] = </span><span style="color: rgb(221, 0, 0); ">'memcache'</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$required_cache </span><span style="color: rgb(0, 119, 0); ">= isset(</span><span style="color: rgb(0, 0, 187); ">$options</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'cache'</span><span style="color: rgb(0, 119, 0); ">]) ? </span><span style="color: rgb(0, 0, 187); ">$options</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'cache'</span><span style="color: rgb(0, 119, 0); ">] : </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">count</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$cache_systems</span><span style="color: rgb(0, 119, 0); ">) && </span><span style="color: rgb(0, 0, 187); ">$required_cache </span><span style="color: rgb(0, 119, 0); ">!= </span><span style="color: rgb(221, 0, 0); ">'none'</span><span style="color: rgb(0, 119, 0); ">)<br></span><span style="color: rgb(0, 0, 187); "> {<br></span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">$required_cache </span><span style="color: rgb(0, 119, 0); ">== </span><span style="color: rgb(221, 0, 0); ">'auto'</span><span style="color: rgb(0, 119, 0); ">)<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">array_shift</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$cache_systems</span><span style="color: rgb(0, 119, 0); ">); </span><span style="color: rgb(255, 128, 0); ">// первое значение в списке<br></span><span style="color: rgb(0, 0, 187); "> else if (</span><span style="color: rgb(0, 0, 187); ">in_array</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$required_cache</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$cache_systems</span><span style="color: rgb(0, 119, 0); ">))<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">$required_cache</span><span style="color: rgb(0, 119, 0); ">;<br></span><span style="color: rgb(0, 0, 187); "> else<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(221, 0, 0); ">'none'</span><span style="color: rgb(0, 119, 0); ">;<br></span><span style="color: rgb(0, 0, 187); "> }<br></span><span style="color: rgb(0, 0, 187); "> else<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(221, 0, 0); ">'none'</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type </span><span style="color: rgb(0, 119, 0); ">== </span><span style="color: rgb(221, 0, 0); ">'memcache'</span><span style="color: rgb(0, 119, 0); ">)<br></span><span style="color: rgb(0, 0, 187); "> {<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$failed </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">true</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> if (isset(</span><span style="color: rgb(0, 0, 187); ">$options</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'memcache'</span><span style="color: rgb(0, 119, 0); ">]) && </span><span style="color: rgb(0, 0, 187); ">is_array</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$options</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'memcache'</span><span style="color: rgb(0, 119, 0); ">]))<br></span><span style="color: rgb(0, 0, 187); "> {<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_memcache </span><span style="color: rgb(0, 119, 0); ">= new </span><span style="color: rgb(0, 0, 187); ">Memcache</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> foreach (</span><span style="color: rgb(0, 0, 187); ">$options</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'memcache'</span><span style="color: rgb(0, 119, 0); ">] as </span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">)<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> {<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> if (!</span><span style="color: rgb(0, 0, 187); ">is_array</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">) || !isset(</span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'host'</span><span style="color: rgb(0, 119, 0); ">])) </span><span style="color: rgb(255, 128, 0); ">// host должен быть указан<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> continue;<br><br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'port'</span><span style="color: rgb(0, 119, 0); ">] = isset(</span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'port'</span><span style="color: rgb(0, 119, 0); ">]) ? (int) </span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'port'</span><span style="color: rgb(0, 119, 0); ">] : </span><span style="color: rgb(0, 0, 187); ">ini_get</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(221, 0, 0); ">'memcache.default_port'</span><span style="color: rgb(0, 119, 0); ">);<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'persistent'</span><span style="color: rgb(0, 119, 0); ">] = isset(</span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'persistent'</span><span style="color: rgb(0, 119, 0); ">]) ? (bool) </span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'persistent'</span><span style="color: rgb(0, 119, 0); ">] : </span><span style="color: rgb(0, 0, 187); ">true</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_memcache</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">addServer</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'host'</span><span style="color: rgb(0, 119, 0); ">], </span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'port'</span><span style="color: rgb(0, 119, 0); ">], </span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'persistent'</span><span style="color: rgb(0, 119, 0); ">]))<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$failed </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">false</span><span style="color: rgb(0, 119, 0); ">;<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> }<br><br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">$failed</span><span style="color: rgb(0, 119, 0); ">)<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_memcache </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">null</span><span style="color: rgb(0, 119, 0); ">;<br></span><span style="color: rgb(0, 0, 187); "> }<br><br></span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">$failed</span><span style="color: rgb(0, 119, 0); ">)<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(221, 0, 0); ">'none'</span><span style="color: rgb(0, 119, 0); ">;<br></span><span style="color: rgb(0, 0, 187); "> }<br> }<br><br> function </span><span style="color: rgb(0, 0, 187); ">get</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">)<br> {<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$data </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">null</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> switch (</span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type</span><span style="color: rgb(0, 119, 0); ">)<br></span><span style="color: rgb(0, 0, 187); "> {<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'none'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'eaccelerator'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$data </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">eaccelerator_get</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">);<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'apc'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$data </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">apc_fetch</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">);<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'xcache'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$data </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">xcache_get</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">);<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'memcache'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$data </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_memcache</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">get</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">);<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> }<br><br></span><span style="color: rgb(0, 0, 187); "> return </span><span style="color: rgb(0, 0, 187); ">$data</span><span style="color: rgb(0, 119, 0); ">;<br> }<br><br> function </span><span style="color: rgb(0, 0, 187); ">put</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">, &</span><span style="color: rgb(0, 0, 187); ">$data</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$ttl</span><span style="color: rgb(0, 119, 0); ">)<br> {<br></span><span style="color: rgb(0, 0, 187); "> switch (</span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type</span><span style="color: rgb(0, 119, 0); ">)<br></span><span style="color: rgb(0, 0, 187); "> {<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'none'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'eaccelerator'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">eaccelerator_put</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$data</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$ttl</span><span style="color: rgb(0, 119, 0); ">);<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'apc'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">apc_store</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$data</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$ttl</span><span style="color: rgb(0, 119, 0); ">);<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'xcache'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">xcache_set</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$data</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$ttl</span><span style="color: rgb(0, 119, 0); ">);<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'memcache'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(255, 128, 0); ">// Решение set() проблемы с несколькими серверами.<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(255, 128, 0); ">// http://www.php.net/manual/ru/function.memcache-set.php#840<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> if (!</span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_memcache</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">replace</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$data</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">MEMCACHE_COMPRESSED</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$ttl</span><span style="color: rgb(0, 119, 0); ">))<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_memcache</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">set</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$data</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">MEMCACHE_COMPRESSED</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$ttl</span><span style="color: rgb(0, 119, 0); ">);<br><br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> }<br> }<br>}<br><br></span><span style="color: rgb(0, 0, 187); ">?></span></span><br /></span>
</pre></div>
<br />
<div class="para">Для тестов были созданы 4 файла:</div>
<br />
<div align="center">
<table style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" class="tgrid" cellpadding="4" cellspacing="0">
<tbody>
<tr>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Название</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Размер</b></td>
</tr>
<tr>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">Тест 1</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">1028299</div>
</td>
</tr>
<tr>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">Тест 2</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">101600</div>
</td>
</tr>
<tr>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">Тест 3</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">10081</div>
</td>
</tr>
<tr>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">Тест 4</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">1010</div>
</td>
</tr>
</tbody>
</table>
</div>
<br />
<div class="para">Содержимое каждого файла представляет из себя сериализованный массив, заполненный случайными значениями. Размеры их, как видите, приблизительно равны 1МБ, 100кБ, 10кБ и 1кБ. В каждом тесте, каждая система тестировалась с каждым из этих файлов.</div>
<br />
<span id="post_p4"></span>
<div class="textheader_h2"><span id="post_p4">Тесты.</span></div>
<span id="post_p4"><br /></span>
<div class="para"><span id="post_p4">Заранее говорю, что тесты искусственные. К реальности приближен только третий тест, но и у него временами были трудности с точностью измерения очень малых промежутков времени. Главное здесь в сравнении работы четырех подопытных кэш-систем в одинаковых условиях.</span></div>
<div class="para"><span id="post_p4">Для большей наглядности я добавил к тестируемым кэш-системам еще и простое чтение файла. В первом тесте из было два:</span></div>
<ul style="margin-top: 0pt; margin-bottom: 0pt; list-style-type: decimal;">
<li><span id="post_p4">Открытие файла, запись, перемещение позиции на начало, чтение, закрытие.</span></li>
<li><span id="post_p4">Открытие файла, запись, закрытие и последующее чтение функцией <tt>file_get_contents()</tt>.</span></li>
</ul>
<div class="para"><span id="post_p4">Для остальных тестов использовалось только чтение файла функцией <tt>file_get_contents()</tt>.</span></div>
<span id="post_p4"><br />
<span id="post_p4_1"></span></span>
<div class="textheader_h3"><span id="post_p4">Тест первый. Зверский.</span></div>
<span id="post_p4"><br /></span>
<div class="para"><span id="post_p4">Алгоритм теста такой: в кэш загружается пара ключ-значение и тут же считывается. Операция многократно повторяется. Контрольное время замеряется до и после цикла. Тест повторяется пять раз в течении одного запуска тестового скрипта. Результатом будет среднее значение этих пяти замеров.</span></div>
<div class="para"><span id="post_p4">Я подумал, что если размеры тестовых данных уменьшаются в десять раз от файла к файлу, то и число повторов тестовой операции стоит повышать в десять раз при переходе к следующему файлу. Для файла "Тест 1" было выполнено 10 повторов. Соответственно, для файла "Тест 4" - 10000.</span></div>
<div class="para"><span id="post_p4">Результаты тестирования представлены в таблице. Время - в секундах.</span></div>
<span id="post_p4"><br /></span>
<div align="center"><span id="post_p4"></span>
<table style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" class="tgrid" cellpadding="4" cellspacing="0">
<tbody>
<tr>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Система</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Тест 1</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Тест 2</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Тест 3</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Тест 4</b></td>
</tr>
<tr>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Файл 1</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">2.336</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">2.561</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">2.191</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">5.407</div>
</td>
</tr>
<tr>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Файл 2</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">2.571</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">2.128</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">3.088</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">8.406</div>
</td>
</tr>
<tr>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>eAccelerator</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">0.432</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">0.402</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">0.338</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">0.475</div>
</td>
</tr>
<tr>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>APC</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">9.699</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">10.036</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">10.264</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">13.970</div>
</td>
</tr>
<tr>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>XCache</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">0.482</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">0.946</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">0.928</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">1.521</div>
</td>
</tr>
<tr>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Memcache</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">3.918</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">3.508</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">3.650</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">4.804</div>
</td>
</tr>
</tbody>
</table>
</div>
<span id="post_p4"><br /></span>
<div class="para"><span id="post_p4">В графическом виде это выглядит так:</span></div>
<span id="post_p4"><br /></span>
<div align="center"><span id="post_p4"><img src="http://deepmemo.com/data/quotes/2008/08/27/14/17/917babb97e" alt="" border="0" lowsrc="http://files.shelek.su/articles/imgforarticles/rxl/temp/test1." width="400" height="" /></span></div>
<span id="post_p4"><br /></span>
<div class="para"><span id="post_p4">Сперва протестировал работу с файлами, eAccelerator, APC и Memcache, а когда перешел к XCache, то скрипт стал аварийно завершаться. В логах Апача было сообщение о нехватке памяти. Увеличил размер с 16 до 32 МБ и повторил эксперимент: опять падение. 128 МБ - тоже. 192 - опять. На 200 МБ скрипт отработал до конца без ошибок. Вот такой вот он - XCache. Пришлось проводить тест для всех систем заново, с едиными условиями. При этом время работы всех систем, кроме Memcache, серьезно сократилось: в 1.5-2 раза. Видимо, за счет уменьшения работ по сборке мусора.</span></div>
<div class="para"><span id="post_p4">Поразила скорость APC: в 2-4 раза медленнее, чем работа с файлами. Memcache тоже оказался не на высоте. eAccelerator, похоже, даже не заметил разницу: что 1 МБ, что 1 кБ, что 10 циклов, что 10000.</span></div>
<span id="post_p4"><br />
<span id="post_p4_2"></span></span>
<div class="textheader_h3"><span id="post_p4">Тест второй. Многократное чтение.</span></div>
<span id="post_p4"><br /></span>
<div class="para"><span id="post_p4">На следующий день я поискал в интернете впечатления других людей о APC - аутсайдере моего теста, и, что интересно, ничего плохого не нашел. По этому я решил сделать еще один тест, более приближенный к реальности. За основу взял первый тест и изменил алгоритм: считывается тестовый файл, помещается в кэш и в цикле считывается. Время измерялось до функции чтения и после, помещалось в массив, а после цикла производилось усреднение результата. Количество циклов было аналогично первому тесту: от 10 до 10000.</span></div>
<div class="para"><span id="post_p4">Результаты представлены в таблице. Время - в секундах.</span></div>
<span id="post_p4"><br /></span>
<div align="center"><span id="post_p4"></span>
<table style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" class="tgrid" cellpadding="4" cellspacing="0">
<tbody>
<tr>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Система</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Тест 1</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Тест 2</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Тест 3</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Тест 4</b></td>
</tr>
<tr>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Файл</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">0.121911</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">0.008692</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">0.001274</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">0.000242</div>
</td>
</tr>
<tr>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>eAccelerator</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">0.025335</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">0.002391</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">0.000201</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">0.000025</div>
</td>
</tr>
<tr>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>APC</b></td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">0.099481</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">
<div style="text-align: right;">0.008770</div>
</td>
<td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-
Keywords: memcache, php, кеширование, оптимизация, комментария, кэширование, способ, коммуникация, процессор |