phpsession怎么用(PHP实现提高SESSION响应速度的几种方法详解)
phpsession怎么用
PHP实现提高SESSION响应速度的几种方法详解本文实例讲述了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
closehtml 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程序设计有所帮助。
原文链接:https://blog.csdn.net/koastal/article/details/52986559
- php验证码实现过程(php伪静态验证码不显示的解决方案)
- php 支付系统(php 实现银联商务H5支付的示例代码)
- dedecms注册怎么给权限(织梦DedeCms系统未审核文档禁止动态浏览修改方法view.php)
- php单例模式教程学习(PHP下用Swoole实现Actor并发模型的方法)
- phplaravel快速开发平台(laravel框架实现去掉URL中index.php的方法)
- php符串使用教程学习(PHP实现支持CURL字符串证书传输的方法)
- phpcurl请求能在日志里记录吗(php使用curl模拟多线程实现批处理功能示例)
- PHP如何安装(PHP使用 Pear 进行安装和卸载包的方法详解)
- php抽象入门教程(php抽象方法和普通方法的区别点总结)
- dedecms新字段(DEDECMSv5.6 tags.php标签不能按照时间排序的问题)
- think php上传服务器(ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例)
- php查找文件存在(php判断目录存在的简单方法)
- 织梦cms中的模块怎么设置(织梦CMS模板在runphp=yes的标签中调用其他field值的方法)
- phpStudy启动失败时的解决方法 提示缺vc9运行库(phpStudy启动失败时的解决方法 提示缺vc9运行库)
- php防sql注入(万能密码的SQL注入漏洞其PHP环境搭建及防御手段)
- php调试用什么工具好(调试php程序的简单步骤)
- 越南旅游攻略(越南旅游攻略自由行)
- 成都旅游攻略(成都旅游攻略自由行最佳线路)
- 给儿童吃什么最好(给儿童吃什么最好消化)
- 杭州旅游攻略()
- 云南旅游攻略(云南旅游攻略5天攻略)
- 收藏 春节假期,这些景区巨划算(收藏春节假期这些景区巨划算)
热门推荐
- 云服务器建站要多大带宽(云服务器的带宽要多大?能容纳多少人?)
- angular路由树(详解Angular路由之子路由)
- python csv文件读取方法(对python读取zip压缩文件里面的csv数据实例详解)
- UrlHelper、HtmlHelper的使用
- html5canvas画图有什么用(Html5基于canvas实现电子签名并生成PDF文档)
- sql语言运算符主要内容(详解SQL EXISTS 运算符)
- nginx查看rewrite日志(Nginx Rewrite使用场景及配置方法解析)
- wamp环境下源码如何安装(从wamp到xampp的升级之路)
- 开源asp.net(apache下支持asp.net的实现方法)
- tomcat详细配置(Tomcat多实例部署及配置原理)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9