gpt4 book ai didi

PHP实现提高SESSION响应速度的几种方法详解

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章PHP实现提高SESSION响应速度的几种方法详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

设置多级目录存储SESSION 。

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

?
1
session.save_path = "2;/tmp"

将SESSION存储到redis中 。

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

?
1
2
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执行过程分析 。

?
1
2
3
4
5
6
7
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 。

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

index.php 。

?
1
2
3
<?php
session_start();
var_dump( $_SESSION );

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

session_commit过程分析 。

?
1
2
3
4
5
6
7
8
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 。

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

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

执行完session_commit之后 。

?
1
2
3
4
5
<?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文件.

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

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

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

注销登录完整代码 。

logout.php 。

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

附录 。

session_function.php 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?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实现提高SESSION响应速度的几种方法详解的文章就讲到这里了,如果你想了解更多关于PHP实现提高SESSION响应速度的几种方法详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com