关于PHP中Session文件过多的问题及session文件保存位置


Posted in PHP onMarch 17, 2016

PHP的默认机制:每一次php请求,会有1/100的概率(默认值)触发“session回收”。如果“session回收”发生,那就会检查/tmp/sess_*的文件,如果最后的修改时间到现在超过了1440秒(gc_maxlifetime的值),就将其删除,意味着这些session过期失效

一、session文件是什么

文件一般为 /tmp/sessions/sess_4b1e384ad74619bd212e236e52a5a174If

username|s:9:"test";admin|s:1:"0";

二、session回收何时发生

默认情况下,每一次php请求,就会有1/100的概率发生回收,所以可能简单的理解为“每100次php请求就有一次回收发生”。这个概率是通过以下参数控制的

#概率是gc_probability/gc_divisor
session.gc_probability = 1
session.gc_divisor = 100

假设这种情况gc_maxlifetime=120,如果某个session文件最后修改时间是120秒之前,那么在下一次回收(1/100的概率)发生前,这个session仍然是有效的。

如果你的session使用session.save_path中使用别的地方保存session,session回收机制有可能不会自动处理过期session文件。这时需要定时手动(或者crontab)的删除过期的session

三、设置session存储目录

使用php5-fpm的话, 修改/etc/php5/fpm/php.ini, 修改或添加下面一行:

session.save_path = 3;600:/tmp/sessions

四、session清除脚本

#!/bin/sh
find /tmp/php-session -cmin +24 -name "sess_*" -and -size 0 -delete > /dev/null 2>&1
find /tmp/php-session -cmin +1440 -name "sess_*" -delete > /dev/null 2>&1

这里的时间我们可以通过 session.gc_maxlifetime 来获取,放到定时任务里面即可(crontab)

其他方式

使用memcache 等 ,(session.save_handler = memcache)

使用cookie,但是cookie得加密

五、使用tmfs存储session

1、将/tmp挂载为 tmpfs文件系统

修改/etc/fstab,在最后一行添加如下内容:/tmp/sessions tmpfs defaults,size=5120m 0 0

mount -a 

2、创建session存储文件夹

php并不会自动去创建这些文件夹,不过在源文件中提供了一些创建文件夹的脚本。下面这个脚本也好用,脚本内容如下

#!/bin/sh
dir="0 1 2 3 4 5 6 7 8 9 a b c d e f"
for levela in $dir;
do
for levelb in $dir;
do
for levelc in $dir;
do
mkdir -p /tmp/sessions/$levela/$levelb/$levelc;
done
done;
done
chown -R root:webgrp /tmp/sessions && chmod -R 1777 /tmp/sessions

因为/tmp/sessions是用的内存,服务器重启后,里面的所有文件都会丢失,所以,需要把上面的脚本加入到 /etc/rc.local中,并且要放在启动php之前

3、将session存储到不同的目录中

php本身支持session的多级散列,在php.ini中,将 ;session.save_path = /tmp 改为

session.save_path = "3;/tmp/sessions

4、session的回收

使用上面的脚本即可

下面给大家说下php session 数据保存在哪里?

当然是在服务器端,但不是保存在内存中,而是保存在文件或数据库中。

默认情况下,php.ini 中设置的 SESSION 保存方式是 files(session.save_handler = files),即使用读写文件的方式保存 SESSION 数据,而 SESSION 文件保存的目录由 session.save_path 指定,文件名以 sess_ 为前缀,后跟 SESSION ID,如:sess_c72665af28a8b14c0fe11afe3b59b51b。文件中的数据即是序列化之后的 SESSION 数据了。

如果访问量大,可能产生的 SESSION 文件会比较多,这时可以设置分级目录进行 SESSION 文件的保存,效率会提高很多,设置方法为:session.save_path="N;/save_path",N 为分级的级数,save_path 为开始目录。

当写入 SESSION 数据的时候,PHP 会获取到客户端的 SESSION_ID,然后根据这个 SESSION ID 到指定的 SESSION 文件保存目录中找到相应的 SESSION 文件,不存在则创建之,最后将数据序列化之后写入文件。读取 SESSION 数据是也是类似的操作流程,对读出来的数据需要进行解序列化,生成相应的 SESSION 变量。

PHP 相关文章推荐
教你IIS6的PHP最佳配置方法
Sep 05 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
May 15 PHP
PHP之APC缓存详细介绍 apc模块安装
Jan 13 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
Nov 18 PHP
优化WordPress中文章与评论的时间显示
Jan 12 PHP
详解PHP5.6.30与Apache2.4.x配置
Jun 02 PHP
PHP简单实现模拟登陆功能示例
Sep 15 PHP
php实现微信企业付款到个人零钱功能
Oct 09 PHP
php 读取文件夹下所有图片、文件的实例
Oct 17 PHP
PHP+redis实现的购物车单例类示例
Feb 02 PHP
Laravel框架实现的使用smtp发送邮件功能示例
Mar 12 PHP
PHP模型Model类封装数据库操作示例
Mar 14 PHP
Symfony2学习笔记之模板用法详解
Mar 17 #PHP
Symfony的安装和配置方法
Mar 17 #PHP
Symfony2中被遗弃的getRequest()方法分析
Mar 17 #PHP
php文件缓存方法总结
Mar 16 #PHP
php常用图片处理类
Mar 16 #PHP
PHP匿名函数和use子句用法实例
Mar 16 #PHP
PHP Static延迟静态绑定用法分析
Mar 16 #PHP
You might like
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
微信开发之php表单微信中自动提交两次问题解决办法
2017/01/08 PHP
用表格输出1-1000之间的数字实现代码(附特效)
2013/04/21 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
javascript的事件触发器介绍的实现
2014/06/05 Javascript
javascript框架设计读书笔记之字符串的扩展和修复
2014/12/02 Javascript
javascript中定义类的方法汇总
2014/12/28 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
jQuery获取checkbox选中的值
2016/01/28 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
webpack4简单入门实例
2018/09/06 Javascript
小程序转发探索示例
2019/02/19 Javascript
vue实现记事本功能
2019/06/26 Javascript
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
element-ui tree结构实现增删改自定义功能代码
2020/08/31 Javascript
[01:20]DOTA2 2017国际邀请赛冠军之路无止竞
2017/06/19 DOTA
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
django2用iframe标签完成网页内嵌播放b站视频功能
2018/06/20 Python
python2 与 python3 实现共存的方法
2018/07/12 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
IE下实现类似CSS3 text-shadow文字阴影的几种方法
2011/05/11 HTML / CSS
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
公务员转正鉴定材料
2014/02/11 职场文书
安全标语口号
2014/06/09 职场文书
商场周年庆活动方案
2014/08/19 职场文书
党员国庆节演讲稿范文2014
2014/09/21 职场文书
消费者投诉书范文
2015/07/02 职场文书
旅游安全责任协议书
2016/03/22 职场文书
Python 全局空间和局部空间
2022/04/06 Python