memcache存储session实现

为什么要用memcache来存储session数据?因为memcache把数据存在内存里,读取速度非常快。

首先要确保服务器已经安装了memcache,若已经安装好,查看启动的memcache服务:

netstat -lp | grep memcached
查看memcache的进程号(根据进程号,可以结束memcache服务:“kill -9 进程号”):

ps -ef | grep memcached
若没有启动memcache服务,则可以去过以下命令启动:

[root@os04 ~]# /usr/local/bin/memcached -d start -u root -m 2120 -p 11211 -c 100000 -f 1.5 -n 300 -P /tmp/memcached.pid
命令执行完成后,可以再重新查看是否启动服务或者查看进程,上面启动命令里面的参数可以根据自己项目的实际需求进行调整。

memcache的环境已经设置并启动完成后,接下来就要配置php了,要将php的session默认存储在memcache里面,只需要配置一下php.ini文件,然后重启php服务即可。

编辑php.ini

[root@os04 /]# vim /usr/local/php/etc/php.ini
找到session的配置路径进行设置:



多台服务器可以用英文逗号隔开,例如:tcp://127.0.0.1:11211,tcp://127.0.0.1:12000

保存php.ini之后,重启php,如果不知道服务器的内网ip地址,可以通过ifconfig命令查看。


启动参数说明:

-d 选项是启动一个守护进程。

-u root 表示启动memcached的用户为root。

-m 是分配给Memcache使用的内存数量,单位是MB,默认64MB。

-M return error on memory exhausted (rather than removing items)。

-u 是运行Memcache的用户,如果当前为root 的话,需要使用此参数指定用户。

-p 是设置Memcache的TCP监听的端口,最好是1024以上的端口。

-c 选项是最大运行的并发连接数,默认是1024。

-P 是设置保存Memcache的pid文件。

-n 分配给key+value+flags的最小空间(默认:48

-f  块大小增长因子。(默认:1.25


“-d”参数进一步的解释

-d install 安装memcached

-d uninstall 卸载memcached

-d start 启动memcache服务

-d restart 重启memcached 服务

-d stop 停止memcached服务

-d shutdown 停止memcached服务


简单总结下,利用memcache保存session一共有三种方式,上面提到的方式是:

session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"

另外一种是直接在php里面利用ini_set()来重置:

ini_set('session.save_handler','memcache');
ini_set('session.save_path','tcp://127.0.0.1:11211');

第三种方式同样也是php程序,直接重写session的操作处理:

<?php
class MemcacheSession{
    protected $handler = null;
    protected $config  = [
        'host'         => '127.0.0.1', // memcache主机
        'port'         => 11211, // memcache端口
        'expire'       => 3600, // session有效期
        'timeout'      => 0, // 连接超时时间(单位:毫秒)
        'persistent'   => true, // 长连接
        'session_name' => '', // memcache key前缀
    ];

    public function __construct($config = []){
        $this->config = array_merge($this->config, $config);
    }

    /**
     * 打开Session
     * @access public
     * @param string    $savePath
     * @param mixed     $sessName
     */
    public function open($savePath, $sessName){
        // 检测php环境
        if (!extension_loaded('memcache')) {
            throw new Exception('not support:memcache');
        }
        $this->handler = new \Memcache;
        // 支持集群
        $hosts = explode(',', $this->config['host']);
        $ports = explode(',', $this->config['port']);
        if (empty($ports[0])) {
            $ports[0] = 11211;
        }
        // 建立连接
        foreach ((array) $hosts as $i => $host) {
            $port = isset($ports[$i]) ? $ports[$i] : $ports[0];
            $this->config['timeout'] > 0 ?
                $this->handler->addServer($host, $port, $this->config['persistent'], 1, $this->config['timeout']) :
                $this->handler->addServer($host, $port, $this->config['persistent'], 1);
        }
        return true;
    }

    /**
     * 关闭Session
     * @access public
     */
    public function close(){
        $this->gc(ini_get('session.gc_maxlifetime'));
        $this->handler->close();
        $this->handler = null;
        return true;
    }

    /**
     * 读取Session
     * @access public
     * @param string $sessID
     */
    public function read($sessID){
        return (string) $this->handler->get($this->config['session_name'] . $sessID);
    }

    /**
     * 写入Session
     * @access public
     * @param string    $sessID
     * @param String    $sessData
     * @return bool
     */
    public function write($sessID, $sessData){
        return $this->handler->set($this->config['session_name'] . $sessID, $sessData, 0, $this->config['expire']);
    }

    /**
     * 删除Session
     * @access public
     * @param string $sessID
     * @return bool
     */
    public function destroy($sessID){
        return $this->handler->delete($this->config['session_name'] . $sessID);
    }

    /**
     * Session 垃圾回收
     * @access public
     * @param string $sessMaxLifeTime
     * @return true
     */
    public function gc($sessMaxLifeTime){
        return true;
    }
}

//使用
session_set_save_handler(new MemcacheSession([]));
session_start();







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章