Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法


Posted in PHP onMay 31, 2016

本文实例讲述了Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法。分享给大家供大家参考,具体如下:

1、首先安装memcache服务端:

sudo apt-get install memcached

安装完成后系统 自动启动了 memcached服务占用11211端口

如需重新配置11211端口的服务 需要关闭已开启的memcached服务

手动启动:

memcached -d -m 128 -p 11211 -u memcache

这里需要说明一下memcached服务的启动参数:

-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25-n 最小分配空间,key+value+flags默认是48
-h 显示帮助

2、安装PHP Memecache 客户端

$ sudo apt-get install php5-memcache

重启web服务器

测试memcache代码:

<?php
$mem = new Memcache; //创建Memcache对象
$mem->connect("127.0.0.1", 11211); //连接Memcache服务器
$val = "这是一个Memcache的测试.";
$key = md5($val);
if(($k = $mem->get($key))){ //判断是否获取到指定的key
  echo 'from cache:'.$k;
} else {
  echo 'normal'; //这里我们在实际使用中就需要替换成查询数据库并创建缓存.
  $mem->set($key, $val, 0, 120); //增加插入一条缓存,缓存时间为120s
}

用memcache存储session

一般地, Session 是以文本文件形式存储在服务器端的。如果使用 Seesion,或者该 PHP 文件要调用 Session 变量,那么就必须在调用 Session 之前启动它,使用 session_start() 函数。其它都不需要你设置了,PHP 自动完成 Session 文件的创建。其默认 Session 的存放路径是服务器的系统临时文件夹。

但是如果碰到大数据量的Sesstion的时候, 使用基于文件的Session存取瓶颈可能都是在磁盘IO操作上,现在利用Memcached来保存Session数据,直接通过内存的方式,效率自然能够提高不少。 在读写速度上会比 files 时快很多,而且在多个服务器需要共用 session 时会比较方便,将这些服务器都配置成使用同一组 memcached 服务器就可以,减少了额外的工作量。

其缺点是 session 数据都保存在 memory 中,一旦宕机,数据将会丢失。但对 session 数据来说并不是严重的问题。

如何用 memcached 来存储 session呢?以下是基本的配置步骤:

1. 安装 memcached (略过,不清楚的筒子可以查看前面一篇文章:https://3water.com/article/85510.htm)
在 phpinfo 输出中的 "Registered save handlers" 会有 "files user sqlite"。

2. 修改配置文件,

①. 在 php.ini 中全局设置(* 需要重启服务器)

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

②. 或者某个目录下的 .htaccess :

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

③. 也可以在某个一个应用中:

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

注:使用多个 memcached server 时用逗号","隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval" 等等,类似这样的:

"tcp://host:port?persistent=1&weight=2,tcp://host2:port2" 。

3. 启动 memcached

memcached -d -m 10 -u root -l 127.0.0.1 -p 11211 -c 256 -P /tmp/memcached.pid

4.测试 创建一个 session

<?php
//set_session.php
session_start();
if (!isset($_SESSION['admin'])) {
  $_SESSION['admin'] = 'wan';
}
print $_SESSION['admin'];
print "/n";
print session_id();
?>

5. 用 sessionid 去 memcached 里查询一下

<?php
//get_session.php
$mem = new Memcache;
$mem->connect("127.0.0.1", 11211);
var_dump($mem->get('0935216dbc0d721d629f89efb89affa6'));
?>
[root@localhost html]# /usr/local/webserver/php/bin/php -f get_session.php

输出结果:

string(16) "admin|s:3:"wan";"

证明 session 正常工作。

再次深入 多域名网站利用MEMCACHE方式共享SESSION数据

通过了解 SESSION 的工作原理,我们可以发现,在默认情况下,各个服务器会各自分别对同一个客户端产生 SESSION ID,如对于同一个用户浏览器,A 服务器产生的 SESSION ID 是 30de1e9de3192ba6ce2992d27a1b6a0a,而 B 服务器生成的则是 c72665af28a8b14c0fe11afe3b59b51b。另外,PHP 的 SESSION 数据都是分别保存在本服务器的文件系统中。

确定了问题所在之后,就可以着手进行解决了。想要共享 SESSION 数据,那就必须实现两个目标:一个是各个服务器对同一个客户端产生的 SESSION ID 必须相同,并且可通过同一个 COOKIE 进行传递,也就是说各个服务器必须可以读取同一个名为 PHPSESSID 的 COOKIE;另一个是 SESSION 数据的存储方式/位置必须保证各个服务器都能够访问到。简单地说就是多服务器共享客户端的 SESSION ID,同时还必须共享服务器端的 SESSION 数据。

第一个目标的实现其实很简单,只需要对 COOKIE 的域(domain)进行特殊地设置即可,默认情况下,COOKIE 的域是当前服务器的域名/IP 地址,而域不同的话,各个服务器所设置的 COOKIE 是不能相互访问的,如 www.aaa.com 的服务器是不能读写 www.bbb.com 服务器设置的 COOKIE 的。这里我们所说的同一网站的服务器有其特殊性,那就是他们同属于同一个一级域,如:tieba.xiaoyuan.com 和 www.xiaoyuan.com 都属于域 .xiaoyuan.com,那么我们就可以设置 COOKIE 的域为 .xiaoyuan.com,这样 tieba.xiaoyuan.com、www.xiaoyuan.com 等等都可以访问此 COOKIE。PHP 代码中的设置方法如下:

<?php
ini_set('session.cookie_domain', 'xiaoyuan.com');
?>

这样各个服务器共享同一客户端 SESSION ID 的目的就达到了。

于是 可以在 a.domain.com 下

session.php

<?php
ini_set('session.cookie_domain', 'domain.com');
session_start();
if (!isset($_SESSION['admin'])) {
  $_SESSION['admin'] = 'wan';
}
print $_SESSION['admin'];
print "\n";
print session_id();

在b.domain.com下

session2.php

<?php
ini_set('session.cookie_domain', 'domain.com');
session_start();
echo $_SESSION['admin'];

希望本文所述对大家Ubuntu平台上的php程序设计有所帮助。

PHP 相关文章推荐
一个简单的自动发送邮件系统(二)
Oct 09 PHP
php array_flip() 删除数组重复元素
Jan 14 PHP
php printf输出格式使用说明
Dec 05 PHP
解析百度搜索结果link?url=参数分析 (全)
Oct 09 PHP
页面利用渐进式JPEG来提升用户体验度
Dec 01 PHP
php实现多维数组排序的方法示例
Mar 23 PHP
laravel如何开启跨域功能示例详解
Aug 31 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
Aug 05 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
Aug 13 PHP
PHP文件打开关闭及读写操作示例解析
Aug 06 PHP
PHP如何通过带尾指针的链表实现'队列'
Oct 22 PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
May 25 PHP
php中json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案
May 31 #PHP
让你的PHP7更快之Hugepage用法分析
May 31 #PHP
PHP表单数据写入MySQL数据库的代码
May 31 #PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
May 30 #PHP
PHP如何实现跨域
May 30 #PHP
php while循环控制的简单实例
May 30 #PHP
Yii2中如何使用modal弹窗(基本使用)
May 30 #PHP
You might like
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
PHP得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
php实现微信支付之企业付款
2018/05/30 PHP
thinkphp5 模型实例化获得数据对象的教程
2019/10/18 PHP
解析arp病毒背后利用的Javascript技术附解密方法
2007/08/06 Javascript
JS实现在Repeater控件中创建可隐藏区域的代码
2010/09/16 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
jQuery中ajax的post()方法用法实例
2014/12/26 Javascript
js实现3D图片逐张轮播幻灯片特效代码分享
2015/09/09 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
JavaScript基础之AJAX简单的小demo
2017/01/29 Javascript
在knockoutjs 上自己实现的flux(实例讲解)
2017/12/18 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
微信小程序实现的图片保存功能示例
2019/04/24 Javascript
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
vue渲染方式render和template的区别
2020/06/05 Javascript
javascript实现移动端轮播图
2020/12/09 Javascript
JavaScript 判断浏览器是否是IE
2021/02/19 Javascript
简单介绍Ruby中的CGI编程
2015/04/10 Python
Python 3.x 新特性及10大变化
2015/06/12 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
Python和Anaconda和Pycharm安装教程图文详解
2020/02/04 Python
PyTorch的torch.cat用法
2020/06/28 Python
python 基于opencv 实现一个鼠标绘图小程序
2020/12/11 Python
详解Django中的FBV和CBV对比分析
2021/03/01 Python
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
挂科检讨书范文
2014/02/20 职场文书
婚前保证书
2014/04/29 职场文书
应届生面试求职信
2014/07/02 职场文书
安全生产先进个人事迹材料
2014/12/30 职场文书
《观潮》教学反思
2016/02/17 职场文书
2022年显卡天梯图(6月更新)
2022/06/17 数码科技