PHP SESSION

首先,使用php5.6以下版本,在使用时发现session无法工作,并且各种论坛教程无果时,请检查session文件是否有数据记录,如果没有请更新版本,附php 5.6.6发行说明一张截图:
图片
所以,可以尽早回头是岸了。。。。
1.session原理:

        (1)客户端请求缓存临时信息
        (2)服务器端产生一个sessionid[可以用session_id()函数获取此id,客户端会用cookis记录此ID 当然是在允许的条件下],并以sess_+sessionid的方式产生一个文件[php默认以文件的形式存储session信息],在客户端提交后临时数据会写入此文件中。
            ps:在这里,因为服务器端是以cookis在存储sessionid,所以当客户端浏览器禁止cookis时,页面跳转会丢失session,原因很简单,跳转后的页面获取不到之前存储的id值,自然就无法加载相应的session文件。
        (3)页面跳转后php获取到相应的session值,然后加载session文件,读取信息!  
ps:在此,我们要注意两个方法session_name()和session_id(),session_name()用于获取和设置session name 也就是存储着sessionid的变量名,php默认的为PHPSESSION,而session_id()则更直接可以直接设置你要加载的session文件,所以在cookis被禁用时我们也并不是无事可做,在跳转前用session_id获取当前session文件ID,然后url 后者post传递到跳转页面,跳转后用session_id()加载,那样便可以让session继续正常工作。


2.session的高阶实现
        (1) 在windows下,由于文件的存取效率比较高,一般用文件的形式存储session无伤大雅,但是在多服务器共享方面就面临一个不大不小的难题,反正在我们公司,老总有过这个想法,最后基本没有实现,替代方案只是部分实现所要求的功能。然后,在linux上,有过测试当文件数超过2000,linux的文件存取效率就会大打折扣,当然这可以通过分文件夹解决,但终归不是上策,直接以文件存储session终究不是长久之计。
        (2)度娘一天之后,除了找到php5 中的session无法写入信息的bug,还有些小的收获,首先,在linux下可以以一种更高效的方式存储session那就是memcached 和mysql。
         
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。【度娘来的】 
         mysql 要我介绍的就不要往下看了! 
 memcached可以看做是一个内存存储器,他的作用是以键值对的形式存储临时数据,常用的方法get(),set()望文知意不多说。mysql功能就更加强大,存储方式也更灵活,而且会让session的时效性更强,数据共享也更方便,但缺点显而易见,从数据库读取和从内存中读取在速度和资源消耗上都不占上风,所有因为没有特殊要求,本次解决session的问题我选择memcached。
        (3)memcached使用
                ① 安装memcached,此时需要libevent的支持,除此没什么特别具体安装步骤不列,往上很多,需要注意的是其它依赖库的安装,个人喜欢yum groupinstall "Development Tools
" 一键安装开发所需要的依赖库。
                ② 要让php扩展memcached需要下载memcached的扩展库,然后进入memcached的解压文件目录使用phpize重新编译php,下一步就是./configure --with-php-config=/*php-config地址*/ 然后make &&make install,这个网上也有具体教程,记得在php.ini中添加extension=memcache.so。
                ③ 然后就是php中session中的配置文件,今天主要想记录的东西,先上一张图
图片 
 
 图中的几个配置项大多意思都很明了,主要是save_handler,此配置即为你想要存储session信息的方式,默认以文件files的方式,如果你换做其它方式,此处必做修改,然后save_path在文件的存储位置,其实就是数据的一个指向,你的数据要去哪里要在这里声明,如果以files方式,此处就为你存储文件的路径,如果为memcached此处的配置方法为:
                    session.save_handler=memcache
                    session.save_path='
tcp://127.0.0.1:11211'   //数据入口,存储数据从11211端口进入所指定的主机这里是本机地址,可以同时指定多个主机,当然在linux上你还需要让防火墙开放你所指定的端口,此处不表。
ps:此处原理就是服务器收到一组session数据,将其交给php处理,php根据这两个配置使用memcache存储,并通过11211端口送入ip为127.0.0.1的主机进行存储和读取。
                ④ 最后就是session的读取,两个测试也,一个简易处理类(就不上色了):

create.php 产生session的页面,这里获取了session_id的值 
        $_SESSION['test4'] = time();
        $_SESSION['test3'] = time();
        $_SESSION['test2'] = time();
        $_SESSION['test1'] = time();

        print"Session ID: " . session_id();

show.php 显示session的页面,这里使用了自己编写的类文件
<?php
         require_once($_SERVER['DOCUMENT_ROOT'].'/8088/modules/session.class.php');
         new session();
         // 没有特别设置,创建实例后就可以正常使用session
         var_dump($_SESSION);
?>
<?php
class session{
	private  $memcache_obj='';
	public function session($ip='127.0.0.1',$port=11211,$sid=''){
		$this->memcache_obj= new Memcache;
		$this->memcache_obj->connect($ip,$port) or die('01:session error!');
	}		
}
#此处修正对memcache的一些误解,session的整个流程都是交给php去处理的,php在调用memcache里面的数据,所以序列化,反序列化
#在php连接memcache服务器都都已完成,并将取出来的值已经赋予了$_SESSION变量,所以是不需要我们再处理的 我们要做的只是需要告诉php存放session的数据源。
?>

                在读取session时需要从mencache中读取,先连接(Memcache的connect方法),然后通过(memcache的get方法,参数是存储数据的键值,这里取session_id可用session_id()函数获取,前提是要开启了cookis,否则就在生成session的页面获取然后自行脑洞传递下去)
ps:偷懒将session开启了自动,不可取,还是应该用session_start()的方式开启。 


一天成果做以记录,如有错误,或有更好的想法欢迎指正,赐教! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值