关于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求小于1000的所有水仙花数的代码
Jan 10 PHP
php导入csv文件碰到乱码问题的解决方法
Feb 10 PHP
PHP调用VC编写的COM组件实例
Mar 29 PHP
PHP中使用php5-ffmpeg撷取视频图片实例
Jan 07 PHP
从wamp到xampp的升级之路
Apr 08 PHP
PHP+MYSQL中文乱码问题
Jul 01 PHP
php上传图片生成缩略图(GD库)
Jan 06 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
Jul 20 PHP
PHP数组编码gbk与utf8互相转换的两种方法
Sep 01 PHP
Mac系统下安装PHP Xdebug
Mar 30 PHP
PHP array_reduce()函数的应用解析
Oct 28 PHP
PHP创建XML接口示例
Jul 04 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
Smarty安装配置方法
2008/04/10 PHP
php 进度条实现代码
2009/03/10 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
PHP中each与list用法分析
2016/01/08 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
2016/11/16 PHP
JavaScript实现多维数组的方法
2013/11/20 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
判断是否存在子节点的实现代码
2016/05/18 Javascript
总结在前端排序中遇到的问题
2016/07/19 Javascript
async/await地狱该如何避免详解
2018/05/10 Javascript
微信小程序支付PHP代码
2018/08/23 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
vue+elementUI实现表单和图片上传及验证功能示例
2019/05/14 Javascript
解决layui-open关闭自身窗口的问题
2019/09/10 Javascript
javascript实现打砖块小游戏(附完整源码)
2020/09/18 Javascript
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
轻松实现python搭建微信公众平台
2016/02/16 Python
python 获取当天每个准点时间戳的实例
2018/05/22 Python
如何用Python来理一理红楼梦里的那些关系
2019/08/14 Python
python实现WebSocket服务端过程解析
2019/10/18 Python
python爬虫爬取幽默笑话网站
2019/10/24 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
pytorch简介
2020/11/11 Python
将不规则的Python多维数组拉平到一维的方法实现
2021/01/11 Python
python如何发送带有附件、正文为HTML的邮件
2021/02/27 Python
去加拿大的旅行和假期:Canadian Affair
2016/10/25 全球购物
HelloFresh奥地利:立即订购烹饪盒
2019/02/22 全球购物
学习全国两会精神心得体会范文
2014/03/17 职场文书
股份转让协议书
2014/04/12 职场文书
党员示范岗材料
2014/12/19 职场文书
旷课检讨书范文
2015/01/27 职场文书
中班下学期个人总结
2015/02/12 职场文书
2015小学教师德育工作总结
2015/05/12 职场文书
行政答辩状范文
2015/05/21 职场文书
幼儿园教学反思范文
2016/03/02 职场文书
MySQL表字段时间设置默认值
2021/05/13 MySQL