Сессии в php с помощью memcached

Оригинал: 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;

Чтобы закрепить прочитанное, скачайте демо и поэкспериментируйте.

 Исходный код     Демо


1 нравится это

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.