如何利用OCS存取PHP session全局变量

阿里云技术团队:余汶龙

 

一、场景介绍

用户在利用PHP搭建网站时,会把一些信息存放在$_SESSION全局变量里,可以很方便的存取。在PHP的ini配置文件里面提供了[Session]相关配置,可以支持将信息存到文件或memcached服务器里面。由配置项session.save_handler = memcached决定。大多数场景,该session数据并不需要持久化,且为了提升网站性能,会选择将session信息缓存到memcached里面。

二、问题

现在问题来了,已知阿里云OCS是实现了标准memcached协议的缓存,用户一方面为了减少服务器内存占用,一方面减少对memcached的维护,希望将session的存储从自建的memcached迁移到OCS上面,且不希望改写代码。切换过程中遇到了问题,因此有了这篇文章,希望能帮到大家。

首先弄清OCS和自建memcached的区别,他们都实现了标准memcached协议。但OCS是分布式集群统一对外提供服务,实现了负载均衡且无单点故障,用户可自由动态弹性调整配置且无需重启服务。既然是对外提供服务,就有相应的安全机制,如白名单、流控、账号密码鉴权。这里对比自建memcached,最重要的区别就是“账号密码鉴权”,因为大多数用户自建memcached是不需要设置账号密码的,跟OCS比就少了SASL鉴权流程。那么用户将session的存储从自建的memcached迁移到OCS上面,就需要在php.ini中配置账号密码。

三、解决

1、在老版本的php memcached扩展中无法支持,需要升级php memcached扩展至2.2.0版本。重新按照阿里云OCS官网教程http://help.aliyun.com/view/11108324_13703944.html?spm=5176.7150518.1996836753.9.OZnEq0 编译扩展。步骤如下:

wget http://pecl.php.net/get/memcached-2.2.0.tgz

tar  zxvf  memcached-2.2.0.tgz

cd memcached-2.2.0

phpize

./configure –with-libmemcached-dir=/usr/local/libmemcached –enable-memcached-sasl

make

make install

2、找到刚升级memcached.so,stat命令确定下是否更新,注意下modify时间

3、修改php.ini配置

3.1 session段

找到[Session]段落,修改存储引擎为:

session.save_handler = memcached(注意是带d扩展)

修改存储地址,即OCS访问地址为:

session.save_path = “be6b6b8221cc11e4.m.cnhzalicm10pub001.ocs.aliyuncs.com:11211″(注意带d扩展,则前面不用加tcp://,不带d的扩展需要加)

修改缓存到memcached的key的时间

session.gc_maxlifetime = 1440(单位是秒,强烈建议必须设置一个合理时间,以保证OCS始终只缓存热点数据)

3.2 memcached段

在php.ini的全局段,建一个单独段落[memcached],然后在空白地方加入下面配置

[memcached]

memcached.use_sasl = On

memcached.sess_binary = On

memcached.sess_sasl_username = “your_ocs_name”

memcached.sess_sasl_password = “your_ocs_password”

memcached.sess_locking = Off

安装步骤完结,上述关于memcached段和Session段其他有用参数,参考链接如下:

http://php.net/manual/en/memcached.configuration.php

http://php.net/manual/en/session.configuration.php

接下来是测试是否生效。

四、测试

写测试代码如下session.php

<?php

session_start();

$sn = session_id();

echo “session id:”.$sn.”\n”;

$_SESSION["ocs_key"]=”session_value”;

echo “session:”.$_SESSION["ocs_key"].”\n”;

?>

 

输出如下:

session id:ttrct9coa2q62r2sodlq4qf376

session:session_value

测试代码get.php去从OCS获取刚才session.php通过session写入的数据

<?php

$memc = new Memcached();

$memc->setOption(Memcached::OPT_COMPRESSION, false);

$memc->setOption(Memcached::OPT_BINARY_PROTOCOL, true);

$memc->addServer(“be6b6b8221cc11e4.m.cnhzalicm10pub001.ocs.aliyuncs.com”, 11211);

$memc->setSaslAuthData(“your_ocs_name”, “your_ocs_password”);

echo $memc->get(“memc.sess.key. ttrct9coa2q62r2sodlq4qf376″);

/*注意这里的key是有前缀的,由php.inimemcached.sess_prefix字段决定,默认值为“memc.sess.key.”。然后再拼接上面打出来的sessionidttrct9coa2q62r2sodlq4qf376”即可。*/

?>

该代码输出如下:

  • ocs_key|s:13:”session_value”;

即PHP SESSION已经成功写入OCS。

?

原文地址:http://blog.aliyun.com/1564

如何利用OCS存取PHP session全局变量,布布扣,bubuko.com

时间: 2024-12-26 02:27:05

如何利用OCS存取PHP session全局变量的相关文章

C#-WebForm-★内置对象简介★Request-获取请求对象、Response相应请求对象、Session全局变量(私有)、Cookie全局变量(私有)、Application全局公共变量、ViewState

内置对象: 1.Request - 获取请求对象 用法:接收传值 protected void Page_Load(object sender, EventArgs e) { TextBox1.Text = Request["abc"]; } 2.Response - 相应请求对象 用法:(李献策lxc) 1.执行代码 //点击按钮执行代码 void Button1_Click(object sender, EventArgs e) { Response.Write("<

采用EaglePHP框架解决分布式集群服务器利用MEMCACHE方式共享SESSION数据的问题

一.问题起源 稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网 站,用户系统是统一的,即一套用户名.密码在整个网站的各个模块中都是可以登录使用的.各个服务器共享用户数据是比较容易实现的,只需要在后端放个数据库 服务器,各个服务器通过统一接口对用户数据进行访问即可.但还存在一个问题,就是用户在这个服务器登录之后,进入另一个服务器的别的模块时,仍然需要重新 登录,这就是一次登录,全部通行的问题,映射到技术上,其实就是各个服务器之间如何实现

多域名THINKPHP利用MEMCACHE方式共享SESSION数据(转)

一.问题起源 稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名.密码在整个网站的各个模块中都是可以登录使用的.各个服务器共享用户数据是比较容易实现的,只需要在后端放个数据库服务器,各个服务器通过统一接口对用户数据进行访问即可.但还存在一个问题,就是用户在这个服务器登录之后,进入另一个服务器的别的模块时,仍然需要重新登录,这就是一次登录,全部通行的问题,映射到技术上,其实就是各个服务器之间如何实现共享

利用session_set_save_handler()函数将session保存到MySQL数据库中

PHP保存session默认的是采用的文件的方式来保存的,这仅仅在文件的空间开销很小的windows上是可以采用的,但是如果我们采用uinx或者是liux上的文件系统的时候,这样的文件系统的文件空间开销是很大的,然而session是要时时刻刻的使用的,大量的用户就要创建很多的session文件,这样对整个的服务器带来性能问题. 另一方面,如果服务器起采用群集的方式的话就不能保持session的一致性,所以我们就绪要采用数据库的方式来保存session,这样,不管有几台服务器同时使用,只要把他们的

springboot集成springsession利用redis来实现session共享

转:https://www.cnblogs.com/mengmeng89012/p/5519698.html 这次带来的是spring boot + redis 实现session共享的教程. 在spring boot的文档中,告诉我们添加@EnableRedisHttpSession来开启spring session支持,配置如下: Java代码   @Configuration @EnableRedisHttpSession public class RedisSessionConfig {

python利用numpy存取文件

NumPy提供了多种存取数组内容的文件操作函数.保存数组数据的文件可以是二进制格式或者文本格式.二进制格式的文件又分为NumPy专用的格式化二进制类型和无格式类型. numpy格式的文件可以保存为后缀为(.npy/.npz)格式的文件 1. tofile()和fromfile() tofile()将数组中的数据以二进制格式写进文件tofile()输出的数据不保存数组形状和元素类型等信息fromfile()函数读回数据时需要用户指定元素类型,并对数组的形状进行适当的修改import numpy a

SpringBoot利用Redis管理分布式Session

https://www.jianshu.com/p/fe9a6c3bda4e 1.添加pom配置 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <

Android --------- 利用SharedPreferences存取数据

//向SharedPreferences中存放数据 //1.定义SharedPreferences对象,通过getSharedPreferences方法得到 SharedPreferences sp = getSharedPreferences(文件名, 模式);//模式通常为MODE_PRIVATE //2.获得该SharedPreferences对象的编辑器Editor Editor editor = sp.edit(); //3.通过编辑器向SharedPreferences中存放数据 e

利用HashMap存取对象并获得键值集合

1.HashMap 已实现的接口 Serializable, Cloneable, Map<K,V> 2.方法摘要 相关代码 /** * * @param ha * write(HashMap<String,Customer> ha) 传来HashMap对象列表 将对象写入文件中 */ public static void write(HashMap<String, Customer> ha) { ; try { ObjectOutputStream oos = new