关于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 相关文章推荐
攻克CakePHP系列一 连接MySQL数据库
Oct 22 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
Jan 27 PHP
利用PHP生成静态HTML文档的原理
Oct 29 PHP
php中的常用魔术方法总结
Aug 02 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
Apr 30 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
Nov 18 PHP
浅谈php中include文件变量作用域
Jun 18 PHP
php使用正则表达式获取字符串中的URL
Dec 29 PHP
yii 2.0中表单小部件的使用方法示例
May 23 PHP
ecshop添加菜单及权限分配问题
Nov 21 PHP
PHP实现的多维数组排序算法分析
Feb 10 PHP
laravel实现查询最后执行的一条sql语句的方法
Oct 09 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中HTTP_REFERER函数用法实例
2014/11/21 PHP
php中fsockopen用法实例
2015/01/05 PHP
Yii实现Command任务处理的方法详解
2016/07/14 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
PHP设计模式之单例模式定义与用法分析
2019/03/26 PHP
laravel 操作数据库常用函数的返回值方法
2019/10/11 PHP
JavaScript 对象、函数和继承
2009/07/07 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
javascript陷阱 一不小心你就中招了(字符运算)
2013/11/10 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
2014/03/28 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
canvas实现图像截取功能
2017/02/06 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
JavaScript数组push方法使用注意事项
2017/10/30 Javascript
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
微信小程序实现传参数的几种方法示例
2018/01/10 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
vue限制输入框只能输入8位整数和2位小数的代码
2019/11/06 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
总结Python编程中函数的使用要点
2016/03/20 Python
一文秒懂python读写csv xml json文件各种骚操作
2019/07/04 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
python爬虫解决验证码的思路及示例
2019/08/01 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
2020/05/10 Python
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
美国女性卫生用品公司:Thinx
2017/06/30 全球购物
Java如何调用外部Exe程序
2015/07/04 面试题
精细化工应届生求职信
2013/11/17 职场文书
办理居住证介绍信
2014/01/15 职场文书
网络管理专业求职信
2014/03/15 职场文书
民间借贷借条如何写
2015/05/26 职场文书
创业计划书之酒吧
2019/12/02 职场文书