0574-82052510,13857483166
当前文章所属类别: 网站建设
点击排行
推荐文章
最新文章
PHP临时文件session的分级存储与定期删除
在Windows上PHP默认的Session服务端文件存放在C:\WINDOWS\Temp下,如果说并发访问很大或者session建立太多,目录下就会存在大量类似sess_xxxxxx的session文件,同一个目录下文件数过多会导致性能下降,并且可能导致受到攻击最终出现文件系统错误。针对这样的情况,PHP本身体提供了比较好的解决办法。

  打开 php.ini ,查找Session设置部分中以下一项:

;     session.save_path = "N;/path"
session.save_path = "C:\Temp"  #此处以你自己设定的路径为准

  这项设置提供给我们可以给session存放目录进行多级散列,其中“N”表示要设置的目录级数,后面的“/path”表示session文件存放的根目录路径,比如我们设置为下面的格式

session.save_path = "2;C:\Temp"

  上面的设置表示我们把php的session文件进行两级目录存储,每一级目录分别是0-9和a-z共36个字母数字为目录名,这样存放session的目录可以达到36*36个,共1332个文件夹,相信作为单台服务器来说,这是完全够用了,如果说您的系统架构设计为多台服务器共享session数据,可以把目录级增加到3级或者更多。

  需要注意的是,php自己并不会自动创建子目录,需要您自己动手去创建。这里将我创建的目录包提供给大家下载,经我测试使用正常。需要的朋友下载后只要将空目录解压缩到你的session存储目录下即可。

点击下载 PHP session 分级目录包(如果下载地址失败,见随身邮PHP_sess_dir.rar)

  网上找到这样的自动创建目录的代码,大家可以做个参考。下面的代码自动创建3级子目录,可以自己动手根据需要进行修改。

<?php
set_time_limit(0);
$string = '0123456789abcdefghijklmnopqrstuvwxyz';
$length = strlen($string);
function makeDir($param)
{
    if(!file_exists($param)) {
        makeDir(dirname($param));
        mkdir($param);
    }
}
for($i = 0; $i < $length; $i++) {
    for($j = 0; $j < $length; $j++) {
        for($k = 0; $k < $length; $k++) {
            makeDir($string[$i].'/'.$string[$j].'/'.$string[$k]);
        }
    }
}
?>

  大家可能注意到前面的文字中提到了有关多服务器共享php的SESSION,这是很多应用都会遇到的问题,网上也有不少相关的资源,大家可以去google一下,这里只提一下大概的思路。

  一般来说我们用到最多的方法有两种:
  1、NFS或者Samba共享的方法,让各个服务器上存放session文件的磁盘共享,这种方法简单可行。
  2、集中存储到数据库中,这是比较多的实现方法,通过php提供的session_set_save_handler()函数来重定义session函数,推荐使用这种方法。

--------------------------------------------------------------------------

  对于session文件的定期删除我写了一个批处理文件,通过计划任务在每天23:40运行,定在这个时间操作,可以保留一天时间的session。将以下代码保存为 del-sess.bat

: 执行时间:每天23:40时执行删除一天前的 PHP session 操作
@echo off
echo 正在执行每天的删除 PHP session 操作
echo 请暂时不要关闭本窗口,删除完毕后系统会自动关闭窗口
forfiles /p "C:\Temp" /s /m sess_* /d -1 /c "cmd /c del @path"
exit

  欢迎大家一起交流和讨论php中和session相关的技巧和经验。

 

 

-----------------------

设置php的session分级存放后,phpMyAdmin运行不正常

首先是phpMyAdmin页面显示错位,然后是页面间_GET和_POST参数都不能正常传递,因为最近还修改了服务器上的一些别的配置,花了很长时间才定位到是session的问题,在phpMyAdmin的libraries/common.lib.php文件中进行debug,发现在session验证的地方总是出错,于是怀疑到php的session故障,不过由于其他应用中使用session都没有问题,应该是phpMyAdmin处理session方面的问题,打开 libraries/session.inc.php,可以看到一些处理session的ini设置项,在适当位置加入下面一行代码,问题得到解决。

ini_set('session.save_path',"your_session_save_path");

由此可以引出一些通用的问题,就是如果在php代码里面改变了ini中session的设置项,则一些关键的项都需要重新设定,php.ini中原来定义的设置就不会继续生效了,今后需要多加注意。

日期:2013-4-15
关闭窗口


网站优化,google优化,百度优化,搜索引擎优化