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 的保存路径为 "tcp://127.0.0.1:6379"
及时释放SESSION文件锁
使用 session 时,要先去执行 session_start()函数。
session_start()函数的作用如下:
判断 http 请求中是否存在名为 PHPSESSID 的 cookie 。若不存在,则创建该 cookie ,并将其写入到 http 响应的头文件中 。
查找通过 PHPSESSID 对应的 session 文件,将其以读写方式打开,接着把里面的数据读取到内存中。
然后我们通常会借助 $_SESSION 这个超全局变量,来读取或者设定 session 的值。在我们进行操作时,session 的值是被保存在内存里的。并且默认情况下,是在页面执行结束之后,才会将其写入到对应的文件中。
我们通过下面的一段代码测试这个过程:
session执行过程分析
引入“session_function.php”。 //session_function.php代码在附录 session_start(); $_SESSION['name']="koastal"; echo "
html content
"; var_dump($_SESSION); echo "
";
输出结果
open
read
html content
array (size=1)
“name”的值为字符串“koastal”,其长度为 7。
shutdown
write
close
从上面的例子能够看出,在页面执行期间,也就是将 php 文件解析为对应的 html 文件所耗费的时间(这里说的页面执行过程并非指用户在该页面上的停留时间),session 文件处于被锁定的状态。
对于某些耗时的操作,像文件上传、发送邮件等。若用户在页面 upload.php 中进行文件上传,接着又打开了个人信息页面 index.php 。然而此时 upload.php 文件尚未执行完成,那么 index.php 中的 session_start()就无法打开对应的 session 文件,而是会一直等待,直到 upload.php 执行完毕。
session死锁示例程序
upload.php
index.php
上面的分析表明,只有在页面执行完毕之后,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 "
html content
"; var_dump($_SESSION); echo "
";输出结果
open
read
write
close
html content
array (size=1)
‘name’ => string ‘koastal’ (length=7)
shutdown
我们可以看到,执行了 session_commit()之后,就把 session 内容提前写到了文件中,接着关闭了文件,从而释放了文件锁。
死锁示例优化后程序
upload.php
我们操作完 session 后,首先把 session 数据写入到文件里,接着再执行上传过程,这样就不会对其他页面使用该 session 文件产生影响了。
执行完session_commit之后
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_commit(),那么在页面执行完毕之后,会自动进行调用。
我们需要做两件事,一是删除内存中的 session 信息,二是删除 session 文件。
删除内存中的 session 信息。 删除 session 文件。如果我们仅仅使用 session_unset(); ,是能够达成注销用户的效果的。然而,这种处理方式在时间上会将 session 的数据设置为空,并且会写入 session 文件当中。实际上,它并没有删除 session 文件。
上面的两部操作,将服务器上的 session 值进行了销毁。同时,我们还需要对保存在客户端中的 cookie 进行清理,以此来完成真正意义上的注销操作。
注销登录完整代码
logout.php
附录
session_function.php
"; return (true); } function close(){ echo __FUNCTION__,"
"; return (true); } function read($id){ echo __FUNCTION__,"
"; } 以下是改写后的句子:函数用于写入特定的内容,其中包含一个标识符 $id 和会话数据 $sess_data 。 echo __FUNCTION__,"
"; return (true); } function destroy($id){ echo __FUNCTION__,"
"; return(true); } function gc($maxlifetime){ echo __FUNCTION__,"
"; return true; } 设置会话保存处理器,分别是“打开”“关闭”“读取”“写入”“销毁”“垃圾回收”。 注册关闭函数为“shutdown”。 function shutdown() { echo __FUNCTION__,"
"; }