关于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 相关文章推荐
详解PHP显示MySQL数据的三种方法
Jun 05 PHP
一个简单php扩展介绍与开发教程
Aug 19 PHP
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
Mar 29 PHP
php注销代码(session注销)
May 31 PHP
PHP setTime 设置当前时间的代码
Aug 27 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
Oct 08 PHP
php处理文件的小例子(解压缩,删除目录)
Feb 03 PHP
安装apache2.2.22配置php5.4(具体操作步骤)
Jun 26 PHP
ThinkPHP表单自动提交验证实例教程
Jul 18 PHP
php一行代码获取文件后缀名实例分析
Nov 12 PHP
PHP实现的限制IP投票程序IP来源分析
May 04 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
Feb 05 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字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
PHP 文件编程综合案例-文件上传的实现
2013/07/03 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
详解PHP队列的实现
2019/03/14 PHP
学习YUI.Ext 第三天
2007/03/10 Javascript
JavaScript修改css样式style
2008/04/15 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
使用jQuery设置disabled属性与移除disabled属性
2014/08/21 Javascript
JS判断浏览器是否支持某一个CSS3属性的方法
2014/10/17 Javascript
js实现网页抽奖实例
2015/08/05 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
超漂亮的Bootstrap 富文本编辑器summernote
2016/04/05 Javascript
jQuery中Find选择器用法示例
2016/09/21 Javascript
原生js实现图片放大缩小计时器效果
2017/01/20 Javascript
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
python中sets模块的用法实例
2014/09/30 Python
深入讲解Java编程中类的生命周期
2016/02/05 Python
Python程序运行原理图文解析
2018/02/10 Python
Flask-Mail用法实例分析
2018/07/21 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
网易2016研发工程师编程题 奖学金(python)
2019/06/19 Python
python os.fork() 循环输出方法
2019/08/08 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
2020/03/19 Python
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
资产评估专业学生的自我鉴定
2013/11/14 职场文书
致跳远、跳高运动员广播稿
2014/01/09 职场文书
求职毕业生自荐书
2014/02/08 职场文书
高三毕业寄语
2014/04/10 职场文书
清明节扫墓活动总结
2015/02/09 职场文书
个人工作表现自我评价
2015/03/06 职场文书
红色电影观后感
2015/06/18 职场文书
优秀教师工作总结2015
2015/07/22 职场文书
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS
python+pyhyper实现识别图片中的车牌号思路详解
2022/12/24 Python