本文实例讲述了PHP实现提高SESSION响应速度的几种方法。分享给大家供大家参考,具体如下:

设置多级目录存储SESSION

默认session的存储目录是1级目录,如果用户量比较大,session文件数量就比较大,我们可以设置目录数为2,使用2级目录可以提交查找和存取速度。不过这种方式对速度的提升一般不是很明显,可以通过修改php.ini,进而修改session存储目录数。

session.save_path = "2;/tmp"

将SESSION存储到redis中

php中的session默认是存储在文件中的,支持redis存储方式,因为redis的键值数据时存储在内存中的,可以提高session的存取速度。

session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"

及时释放SESSION文件锁

我们在使用session时,需要先执行session_start()函数。

session_start()函数的作用如下:

判断http请求是否包含名为PHPSESSID的cookie,如果没有则创建该cookie并写入到http响应的头文件。

通过PHPSESSID查找对应的session文件,以读写方式打开的文件,然后读取里面的数据到内存。

然后我们一般会通过$_SESSION这个超全局变量,读取或者设置session的值,我们操作的时候,session的值都是保存在内存中的,默认在页面执行完毕之后,才会写入到对应的文件中。

我们通过下面的一段代码测试这个过程:

session执行过程分析

include "session_function.php"; 
//session_function.php代码在附录
session_start();
$_SESSION['name']="koastal";
echo "<br/>html content<br/>";
var_dump($_SESSION);
echo "<br/>";

输出结果

open
read
html content
array (size=1)
  'name' => string 'koastal' (length=7)
shutdown
write
close

通过上面的例子可以发现,在页面执行的过程中(页面的执行过程是指将php文件解析为对应的html文件的耗时,而不是用户在该页面上的停留时间),session文件是被锁定的。

对于一些耗时的操作,比如文件上传,发送邮件等,如果用户在页面upload.php文件中上传文件,然后他又打开了个人信息页面index.php,然而upload.php文件还没有执行完成,index.php中的session_start()就不能打开对于的session文件,一直等待到upload.php执行完毕。

session死锁示例程序

upload.php

<?php
session_start();
$_SESSION['name']='koastal';
sleep(10); //sleep 10s 模拟文件上传耗时

index.php

<?php
session_start();
var_dump($_SESSION);

通过上面的分析可以知道,session在页面执行完毕之后,才会写入到文件中,并释放文件锁。session的功能,我们一般都是在页面中的一部分用到的,当我们处理完session之后,可以使用session_commit()或者session_write_close()函数,提前将session的值写入到文件中,并释放文件锁。

session_commit过程分析

include "session_function.php"; 
//session_function.php代码在附录
session_start();
$_SESSION['name']="koastal";
session_commit();
echo "<br/>html content<br/>";
var_dump($_SESSION);
echo "<br/>";

输出结果

open
read
write
close

html content
array (size=1)
  'name' => string 'koastal' (length=7)

shutdown

我们可以看到,在执行了session_commit()之后,就提前将session内容写到文件中,并且关闭文件(释放文件锁)了。

死锁示例优化后程序

upload.php

<?php
session_start();
$_SESSION['name']='koastal';
session_commit();
sleep(10); //sleep 10s 模拟文件上传耗时

我们操作完session之后,先讲session数据写入到文件,然后再执行上传过程,就不会影响到其他页面使用该session文件了。

执行完session_commit之后

<?php
session_start();
$_SESSION['name'] = "koastal";
session_commit();
echo $_SESSION['name'];

session_commit的另一个名字是session_write_close,也就是将session信息写入并关闭文件的意思。session_commit之后,虽然session文件已经关闭,但是页面还在执行,只要没有执行session_unset内存中就还保存着session的值,所以我们还可以获取和输出session的值。其实,这个时候我们还可以给session赋值,但是这个赋值只是赋值到内存中,因为文件已经关闭,所以其他页面时访问不到session_commit();之后设置的session的值。

销毁session

既然已经探讨了这么多session的问题了,那么我们在说一下用户注销时,销毁session的操作。

通过上面的分析,我们知道session的值会保存在内存和文件两个地方。
session_start()会将对应文件打开,并将session数据读入到内存。
session_commit()会将内存中的session数据写入到文件中,并关闭文件。
不显示调用session_commit()的话,会在页面执行完毕之后,自动调用。

所以,我们需要删除内存中的session信息,并且删除session文件。

session_unset();  //删除内存中的session信息
session_destory(); //删除session文件

如果我们只是用session_unset();也能达到注销用户的效果,但是这样处理时间上是把session的数据设置为空,并且写入session文件中了,本质上并没有删除session文件。

上面的两部操作,销毁了服务器上的session值,此外,我们还需要清理保存在客户端中的cookie,完成真正意义上的注销操作。

注销登录完整代码

logout.php

<?php
session_unset();  //删除内存中的session信息
session_destory(); //删除session文件
setcookie('PHPSESSID', null, time()-10);//将cookie值设置为过期

附录

session_function.php

<?php
function open($save_path, $session_name) {
  echo __FUNCTION__,"<br/>";
  return (true);
}
function close(){
  echo __FUNCTION__,"<br/>";
  return (true);
}
function read($id){
  echo __FUNCTION__,"<br/>";
}
function write($id, $sess_data){
  echo __FUNCTION__,"<br/>";
  return (true);
}
function destroy($id){
  echo __FUNCTION__,"<br />";
  return(true);
}
function gc($maxlifetime){
  echo __FUNCTION__,"<br />";
  return true;
}
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
register_shutdown_function('shutdown');
function shutdown()
{
  echo __FUNCTION__,"<br />";
}

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php缓存技术总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《PHP错误与异常处理方法总结》、《php面向对象程序设计入门教程》、《php mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

PHP实现提高SESSION响应速度的几种方法详解的更多相关文章

  1. HTML5 Web缓存和运用程序缓存(cookie,session)

    这篇文章主要介绍了HTML5 Web缓存和运用程序缓存(cookie,session),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. iOS Swift上弃用后Twitter.sharedInstance().session()?. userName的替代方案

    解决方法如果您仍在寻找解决方案,请参阅以下内容:

  3. 使用Fabric SDK iOS访问Twitter用户时间线

    我试图在这个问题上挣扎两天.我正在使用FabricSDK和Rest工具包,试图为Twitter使用不同的RestAPIWeb服务.我可以使用具有authTokenSecret,authToken和其他值的会话对象的TWTRLogInButton成功登录.当我尝试获取用户时间线时,我总是得到失败的响应,作为:{“errors”:[{“code”:215,“message”:“BadAuthentic

  4. ios – 如何从Apple Watch调用iPhone上定义的方法

    有没有办法从Watchkit扩展中调用iPhone上的类中定义的方法?根据我的理解,目前在Watchkit和iPhone之间进行本地通信的方法之一是使用NSUserDefaults,但还有其他方法吗?

  5. ios – 如何将视频从AVAssetExportSession保存到相机胶卷?

    在此先感谢您的帮助.解决方法只需使用session.outputURL=…

  6. ios – 使用AVCaptureSession sessionPreset = AVCaptureSessionPresetPhoto拉伸捕获的照片

    解决方法所以我解决了我的问题.这是我现在使用的代码,它工作正常:…重要的输出imagaView:一些额外的信息:相机图层必须是全屏,并且outputimageView也必须是.我希望这些对某些人来说也是有用的信息.

  7. 我可以在iOS中自定义Twitter工具包的登录按钮吗?

    我已经下载了Twitter工具包框架并添加了用Twitter登录的代码.但是,我不希望登录按钮看起来像那样.我想要一个用于登录的自定义按钮.我能这样做吗?我只想使用这个框架,因为这也适用于iOS系统帐户.解决方法根据document:在按下按钮中添加代码:Objective-C的迅速

  8. ios – AVCaptureSession条形码扫描

    解决方法以下是我所拥有的项目代码示例,可以帮助您走上正确的轨道

  9. ios – 如何在Watch OS 2中引用不支持的框架

    有没有办法将框架链接到扩展名?

  10. ios7 – 在iOS 7中设置Alamofire中的自定义HTTP标头不工作

    解决方法我得到它的工作这对iOS7没有影响:然而,这将适用于iOS7和8:

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部