Кэширование в PHP
18 May 2008 – 14:55Уже невозможно представить современный сайт так или иначе не использующий возможностей кэширования. Создание кэша - одно из средств оптимизации, позволяющее значительно увеличить производительность работы вашего движка. Существует несколько вариантов использования механизма кэширования.
Первый вариант - использование PEAR пакета Cache_Lite для выборочного кэширования данных.
Это небольшое и простое решение позволяет кэшировать как результаты запроса, так и страницу целиком.
Сохраняем в кэше (в директории /to/cachedir/) результаты mysql запроса, время жизни устанавливаем 1 час:
-
-
require_once 'Cache/Lite.php';
-
-
$query = 'SELECT * FROM `tab`';
-
-
$cache = new Cache_Lite(array('cacheDir' => '/to/cachedir/', 'lifeTime' => 3600));
-
-
if (!($res_id = $cache->get($query))) {
-
$res_id = mysql_query($query);
-
$cache->save($res_id, $query);
-
}
-
Второй вариант - кэшировать байткод. Для этого подходит PECL модуль APC, который позволяет избежать трансляции одного и того же PHP кода в байткод при каждом вызове скрипта.
Для настройки модуля правим php.ini:
-
-
extension=apc.so
-
-
[apc]
-
apc.enabled = 1
-
apc.shm_segments = 4
-
apc.shm_size = 64
-
apc.optimization = 0
-
apc.ttl = 3600
-
apc.user_ttl = 3600
-
apc.num_files_hint = 1000
-
apc.mmap_file_mask = /tmp/apc.XXXXXX
-
Функция для трансляции и сохранения в кэше может выглядеть так:
-
-
function compile_files($dir){
-
$dirs = glob($dir . DIRECTORY_SEPARATOR . '*', GLOB_ONLYDIR);
-
if (is_array($dirs) && count($dirs) > 0){
-
while(list(,$v) = each($dirs)){
-
compile_files($v);
-
}
-
}
-
-
$files = glob($dir . DIRECTORY_SEPARATOR . '*.php');
-
if (is_array($files) && count($files) > 0){
-
while(list(,$v) = each($files)){
-
apc_compile_file($v);
-
}
-
}
-
}
-
compile_files('/to/cachedir');
-
Третий вариант позволяет кэшировать данные не на харде, а в оперативной памяти, для этого будем использовать PECL модуль memcached. Сервер memcached впервые был разработан для LiveJournal и позволил снизить загрузку серверов баз данных в разы.
Пример использования:
-
-
$id = (int) $_GET['id'];
-
-
$memcached = new Memcache;
-
$memcached->connect('hostname', 11211);
-
-
if (!$row = $memcached->get('id_' . $id)){
-
$res = mysql_query('SELECT * FROM post WHERE post_id = ' . $id);
-
if ($res && mysql_num_rows($res) > 0){
-
$row = mysql_fetch_assoc($res);
-
$memcached->set('id_' . $id, $row, MEMCACHE_COMPRESSED, time() + 3600);
-
}}
-

комментарии (2) to “Кэширование в PHP”
Дмитрий Ожегов -- Jun 16, 2008
Точно так же и я делаю))))))))
Вячеслав -- Jan 3, 2009
Alex, если я правильно понимаю, то 2-ой вариант может использоваться независимо от 1-го и 3-го - это оптимизация самого PHP.
1 и 3 - это уже оптимизация за счет того, что сокращается количество обращения к БД - данные или сгенерированный HTML кэшируются (1 - в файловой системе, 3 - в операционной памяти).
Т.е. если я правильн понимаю, то самым быстрым будет использование 2-го варианта в связке с 3-им.
Сейчас есть сложный проект, где хочу попробовать использовать memcache. Проект на VDS с небольшим количеством операционной памяти (~ 100 Mb).
Как вы считаете есть ли при таком раскладе смысл использовать быстрый memcache (боюсь переполенния оперативки) или лучше кэшировать в файловой системе?