PHP 服务器以文件储存 SESSION 的两个问题

在默认状况下,咱们在服务器上的SESSION是以文件储存的,这种状况至少到带来两个问题: php

  1. 在高并发或销毁时间较长的状况下,在SESSION目录下产生大量文件。这会致使两个问题:第1、查找文件慢;第二,每一个目录下可容纳的文件数是有限的,可能会致使新SESSION储存失败。
  2. 在SESSION初始化时,会锁住文件,直到程序执行完毕才释放,致使其它并发的脚本在初始化SESSION时产生阻塞。这意味着其它的脚本都在等待这个锁,从而产生性能问题。

这两个问题随便发生一个,都是不可接受的,若是产生了叠加效果,则更恐怖。 数据库

如下两个脚本是证明问题2的依据: 服务器

<?php
// a.php
session_start();
$_SESSION['MYNAME'] = 'HEIING';
sleep(10); // 睡10秒,以便观察,一般这里是一些数据库及业务逻辑操做
echo 'done';
<?php
// b.php
session_start();
echo $_SESSION['MYNAME'];
echo "\ndone";
先运行a.php,再运行b.php,会发现阻塞。

解决方案: session

  1. 写入SESSION后,尽早使用 session_write_close() 进行解锁,好比在a.php的sleep以前添加一行session_write_close();
  2. 使用内存等无锁方案,好比储存到MemCached、MySql中
  3. 使用Cookie保存到客户端,用户信息能够加密后写到Cookie中,好比使用TEA等轻量级的加密方案。
相关文章
相关标签/搜索