Оригинал: itlessons.info
По умолчанию сессии в php хранятся в файлах. Как правили во временном каталоге, который чиститься операционной системой или самим php. При росте нагрузке обычно переносят хранение сессионных данных в memcached, чтобы улучшить производительность. Но помимо производительности, использование memcached позволяет распределить работу приложения на несколько серверов. Главное, чтобы у каждого из них был доступ в memcached. Конечно, при распределении необходимо решить и другие задачи, но сессии являются одними из них.
В PHP реализация хранения сессий в memcached проста. Необходимо создать класс, в нем реализовать интерфейс SessionHandlerInterface и зарегистрировать его для работы с сессиями.
class MemcachedSessionHandler implements \SessionHandlerInterface { /** * @var Memcached */ private $memcached; private $ttl; private $prefix; public function __construct( \Memcached $memcached, $expiretime = 86400, $prefix = 'sess_') { $this->memcached = $memcached; $this->ttl = $expiretime; $this->prefix = $prefix; $this->useMe(); } public function open($savePath, $sessionName) { return true; } public function close() { return true; } public function read($sessionId) { return $this->memcached->get($this->prefix . $sessionId) ? : ''; } public function write($sessionId, $data) { return $this->memcached->set( $this->prefix . $sessionId, $data, time() + $this->ttl); } public function destroy($sessionId) { return $this->memcached->delete($this->prefix . $sessionId); } public function gc($lifetime) { return true; } private function useMe() { session_set_save_handler( array($this, 'open'), array($this, 'close'), array($this, 'read'), array($this, 'write'), array($this, 'destroy'), array($this, 'gc') ); register_shutdown_function('session_write_close'); } }
Префикс должен быть уникальный для каждого сайта. Иначе будут накладки и, как правило, трудно находимые ошибки.
Реализовав данный класс теперь можно его использовать и работать с сессиями как обычно:
/init $cache = new Memcached(); $cache->addServer('127.0.0.1', 11211); $session = new MemcachedSessionHandler($cache); session_start(); //use if(isset($_SESSION['some_key'])){ //do something } $_SESSION['some_key'] = 1;
Чтобы закрепить прочитанное, скачайте демо и поэкспериментируйте.