Оригинал: 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;
Чтобы закрепить прочитанное, скачайте демо и поэкспериментируйте.