关于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 相关文章推荐
paypal即时到账php实现代码
Nov 28 PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
Jun 03 PHP
PHP实现的连贯操作、链式操作实例
Jul 08 PHP
Codeigniter中mkdir创建目录遇到权限问题和解决方法
Jul 25 PHP
thinkPHP学习笔记之安装配置篇
Mar 05 PHP
php实现用于计算执行时间的类实例
Apr 18 PHP
使用PHP uniqid函数生成唯一ID
Nov 18 PHP
PHP+JQuery+Ajax实现分页方法详解
Aug 06 PHP
PHP实现的简单路由和类自动加载功能
Mar 13 PHP
php抽象方法和普通方法的区别点总结
Oct 13 PHP
Yii框架应用组件用法实例分析
May 15 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
May 25 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跨平台获取服务器IP地址自定义函数分享
2014/12/29 PHP
万能的php分页类
2017/07/06 PHP
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
jquery控制listbox中项的移动并排序的实现代码
2010/09/28 Javascript
js中return false(阻止)的用法
2013/08/14 Javascript
JS格式化数字金额用逗号隔开保留两位小数
2013/10/18 Javascript
获取3个数组不重复的值的具体实现
2013/12/30 Javascript
js通过iframe加载外部网页的实现代码
2015/04/05 Javascript
javascript实现省市区三级联动下拉框菜单
2015/11/17 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
js字符串处理之绝妙的代码
2019/04/05 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
2019/06/22 Javascript
JavaScript TAB栏切换效果的示例
2020/11/05 Javascript
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
Python检测网站链接是否已存在
2016/04/07 Python
Python3.4实现远程控制电脑开关机
2018/02/22 Python
Python continue继续循环用法总结
2018/06/10 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
django中的图片验证码功能
2019/09/18 Python
Python3 Tkinkter + SQLite实现登录和注册界面
2019/11/19 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
python GUI计算器的实现
2020/10/09 Python
新浪网技术部笔试题
2016/08/26 面试题
大学生暑期社会实践证明范本
2014/10/24 职场文书
自查自纠工作情况报告
2014/10/29 职场文书
中考学习决心书
2015/02/04 职场文书
2015年行政工作总结范文
2015/04/09 职场文书
Python图片处理之图片裁剪教程
2021/05/27 Python
MySQL派生表联表查询实战过程
2022/03/20 MySQL
Python实现批量将文件复制到新的目录中再修改名称
2022/04/12 Python
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL
MySQL常用慢查询分析工具详解
2022/08/14 MySQL