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