关闭

memcache存储session实现

标签: sessionmemcachephp
175人阅读 评论(0) 收藏 举报
分类:

为什么要用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();







0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

分布式memcache实现web集群session同步

php的session默认是文件存储: session.save_handler = files session.save_path = "/var/lib/php/session" 当做we...
  • nuli888
  • nuli888
  • 2016-08-04 20:23
  • 665

java项目使用memcache实现session共享+session基础

本文章主要目的是配置session共享,为了巩固基础,捎带介绍了一些基础知识(网上搜索后觉得最全面的特引过来,节省时间),基础扎实的可以自动忽略。 基础篇: 1.了解java web中的s...
  • shandalue
  • shandalue
  • 2014-11-26 21:23
  • 4281

Memcache高可用共享session,容纳100万人同时在线

企业网站用户数越来越多,
  • kongdeqian1988
  • kongdeqian1988
  • 2014-08-08 11:13
  • 7985

将session放到memcache上面

参考资料: http://www.cnblogs.com/Alexander-Lee/archive/2010/06/27/1766229.html
  • cdnight
  • cdnight
  • 2014-02-07 10:03
  • 3923

PHP框架Yii系列教程(四):使用Memcache保存会话

1环境准备 安装Memcached服务端: yum -y installmemcached.x86_64   安装PHP-Memcache扩展: yum -y installphp-pecl...
  • dc_726
  • dc_726
  • 2013-04-28 21:23
  • 11807

使用Memcache实现Session共享(单点登录)的原理

使用Memcache实现Session共享(单点登录)的原理
  • u013905744
  • u013905744
  • 2016-10-11 14:22
  • 2436

项目笔记:2.tomcat的集群使用memcache实现session一致性

tomcat的集群使用memcache实现session一致性
  • knuuy
  • knuuy
  • 2015-06-27 13:13
  • 1204

Memcache如何实现分布式存取?

前言      上一篇主要总结了memcache的基本概念以及工作流程,这一篇着重总结它内部的存储机制 分布式和集群辨析         进入项目之后,经常听到的就是这两个词,要想了解memcac...
  • cd18333612683
  • cd18333612683
  • 2016-08-21 20:43
  • 848

实现基于Memcache存储的Session类

实现基于Memcache存储的Session类 作者:heiyeluren 博客:http://blog.csdn.net/heiyeshuwu 我没事的时候写的自主实现Sessio...
  • phperli
  • phperli
  • 2015-07-08 20:10
  • 138

负载均衡下的多台tomcat服务器,通过memcache实现session共享

session共享的应用场景 大型分布式网站,通常使用的架构是,硬件均衡设备(cisco以太网通道、windows nlb技术、linux lvs技术、f5等负载均衡器)——>多台Squid、ngin...
  • iktz_cn
  • iktz_cn
  • 2015-11-27 21:15
  • 3647
    个人资料
    • 访问:63487次
    • 积分:1303
    • 等级:
    • 排名:千里之外
    • 原创:69篇
    • 转载:17篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论