关于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中文件读、写、删的操作(PHP中对文件和目录操作)
Mar 06 PHP
分享一下贝贝成长进度的php代码
Sep 14 PHP
php设计模式小结
Feb 15 PHP
解析php扩展php_curl.dll不加载的解决方法
Jun 26 PHP
PHP 动态生成静态HTML页面示例代码
Jan 15 PHP
php实现图片添加水印功能
Feb 13 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
Mar 28 PHP
php格式化金额函数分享
Feb 02 PHP
开启PHP Static 关键字之旅模式
Nov 13 PHP
PHP图像裁剪缩略裁切类源码及使用方法
Jan 07 PHP
PHP二分查找算法示例【递归与非递归方法】
Sep 29 PHP
php获取今日开始时间和结束时间的方法
Feb 27 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 explode()函数用法、切分字符串
2012/10/03 PHP
php笔记之:文章中图片处理的使用
2013/04/26 PHP
基于php缓存的详解
2013/05/15 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
PHP中使用GD库创建圆形饼图的例子
2014/11/19 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
深入浅析php json 格式控制
2015/12/24 PHP
php文件上传 你真的掌握了吗
2016/11/28 PHP
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
Script的加载方法小结
2011/01/12 Javascript
基于jquery的回到页面顶部按钮
2011/06/27 Javascript
jQuery 2.0.3 源码分析之core(一)整体架构
2014/05/27 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
详细探究ES6之Proxy代理
2016/07/22 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
JavaScript实现快速排序的方法分析
2018/01/10 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
在Koa.js中实现文件上传的接口功能
2019/10/08 Javascript
python中map、any、all函数用法分析
2015/04/21 Python
python 遍历字符串(含汉字)实例详解
2017/04/04 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
如何在mac版pycharm选择python版本
2020/07/21 Python
django跳转页面传参的实现
2020/09/17 Python
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
使用postMessage让 iframe自适应高度的方法示例
2019/10/08 HTML / CSS
Oroton中国官网:澳洲知名奢侈配饰品牌
2017/03/26 全球购物
Invicta手表官方商店:百年制表历史的瑞士腕表品牌
2019/09/26 全球购物
酒店拾金不昧表扬信
2014/01/18 职场文书
航海技术专业毕业生求职信
2014/04/06 职场文书
会员卡清退活动总结
2014/08/27 职场文书
安全生产先进个人事迹材料
2014/12/30 职场文书
小学生心理健康活动总结
2015/05/08 职场文书
2015年度高中教师工作总结
2015/05/26 职场文书
学生会任命书范本
2015/09/21 职场文书
python读取pdf格式文档的实现代码
2021/04/01 Python