Механизм сессий в PHP позволяет в течении некоторого времени хранить данные с привязкой к конкретному посетителю. Это удобный инструмент для решения достаточно большого спектра задач, в частности защиты от спама, сохранения настроек до конца сеанса и проч. По умолчанию сессионные данные сохраняются в файлах во временной директории что не является самым оптимальным вариантом и поэтому часто используют альтернативные хранилища.
XCache это модуль для PHP, ускоряющий работу скриптов за счёт кэширования их прекомпилированного байт-кода в памяти. Модуль может работать с PHP, запущенным как fastcgi-процесс или как модуль веб-сервера. Кроме того модуль можно ещё использовать как временное хранилище данных в памяти (по принципу "ключ - значение"). Это позволяет использовать XCache в качестве достаточно быстрого и эффективного хранилища сессионных данных.
Далее будет показано как именно можно сохранять сессионные данные в XCache. Описываемое решение автор использует на этом сайте.
Немного о начальных данных:
- Сервер под управлением Debian Lenny;
- Apache2 и php5 из репозитория;
Установим XCache:
apt-get install php5-xcache
После установки приведём файл "/etc/php5/conf.d/xcache.ini" примерно вот к такому виду (Уточните параметры под свои потребности. Детальное их описание есть в документации):
[xcache-common] zend_extension = /usr/lib/php5/20060613+lfs/xcache.so [xcache.admin] xcache.admin.enable_auth = Off [xcache] xcache.shm_scheme = "mmap" xcache.size = 96M xcache.count = 1 xcache.slots = 8K xcache.ttl = 0 xcache.gc_interval = 0 xcache.var_size = 16M xcache.var_count = 1 xcache.var_slots = 8K xcache.var_ttl = 3600 xcache.var_maxttl = 604800 xcache.var_gc_interval = 3600 xcache.test = Off xcache.readonly_protection = Off xcache.mmap_path = "/dev/zero" xcache.coredump_directory = "/tmp" xcache.cacher = On xcache.stat = On xcache.optimizer = On [xcache.coverager] xcache.coverager = Off xcache.coveragedump_directory = "/tmp"
Закончив конфигурирование перезапустим веб-сервер:
invoke-rc.d apache2 reload
На этом XCache можно считать сконфигурированным. Теперь перейдём в директорию с нашим сайтом и создадим файл "sessions.php", следующего содержания:
<?php //============================================================================== // Функция открывает сессию. В нашем случае ничего делать не надо function yl_session_open($save_path, $session_name) { return TRUE; } //============================================================================== //============================================================================== // Поскольку на самом деле мы ничего не открывали - закрывать тоже ничего не надо function yl_session_close() { return TRUE; } //============================================================================== //============================================================================== // Чтение данных из сессии. // На входе идентификатор сессии. На выходе - строка (сериализованный массив). function yl_session_read($key) { // Препарируем ключ $key = 'yl_session_' . md5($key); // Извлекаем данные $rv = xcache_get($key); // Возвращаем результат return $rv !== FALSE ? $rv : ''; } //============================================================================== //============================================================================== // Сохранение данных в сессии. // На входе идентификатор сессии и строка данных для записи function yl_session_write($key, $val) { // Препарируем ключ $key = 'yl_session_' . md5($key); // Сохраняем данные $rv = xcache_set($key, $val, ini_get('session.gc_maxlifetime')); // Возвращаем результат return $rv; } //============================================================================== //============================================================================== // Удаление записи о сессии. // На входе - идентификатор сессии function yl_session_destroy($key) { // Препарируем ключ $key = 'yl_session_' . md5($key); // Удаляем данные $rv = xcache_unset($key); return $rv; } //============================================================================== //============================================================================== // Сборщик мусора. // Поскольку xcache сам удаляет устаревшие данные - ничего тут делать не надо function yl_session_gc($maxlifetime) { return TRUE; } //============================================================================== // Регистрируем наш обработчик сессий ini_set('session.save_handler', 'user'); session_set_save_handler( 'yl_session_open', 'yl_session_close', 'yl_session_read', 'yl_session_write', 'yl_session_destroy', 'yl_session_gc' );
Теперь во все файлы, в которых необходимо использование сессий, необходимо подключить файл "sessions.php" ДО вызова функции "session_start()". Примерно вот так:
include_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'sessions.php'; session_start();
Так же стоит отметить наличие у XCache интерфейса администратора, позволяющего просматривать статистику работы модуля и в минимальных пределах управлять им, но его рассмотрение выходит за рамки этой статьи.
На этом всё. Приятной работы!
Anonymous 2011-02-08 23:50:38 (#)
session.save_path = /path/to/mounted/tmpfs
// Sylvia