关于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 相关文章推荐
WINXP下apache+php4+mysql
Nov 25 PHP
从康盛产品(discuz)提取出来的模板类
Jun 28 PHP
PHP取二进制文件头快速判断文件类型的实现代码
Aug 05 PHP
php使用websocket示例详解
Mar 12 PHP
PHP中date与gmdate的区别及默认时区设置
May 12 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
Aug 20 PHP
Yii学习总结之安装配置
Feb 22 PHP
基于PHP技术开发客服工单系统
Jan 06 PHP
PHP入门教程之表单与验证实例详解
Sep 11 PHP
PHP新特性之字节码缓存和内置服务器
Aug 11 PHP
PHP基于GD2函数库实现验证码功能示例
Jan 27 PHP
laravel-admin 中列表筛选方法
Oct 03 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
支持php4、php5的mysql数据库操作类
2008/01/10 PHP
php skymvc 一款轻量、简单的php
2011/06/28 PHP
php实现删除指定目录下相关文件的方法
2014/10/20 PHP
详解Window7 下开发php扩展
2015/12/31 PHP
php实现的AES加密类定义与用法示例
2018/01/29 PHP
javascript同步Import,同步调用外部js的方法
2008/07/08 Javascript
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
Jquery1.9.1源码分析系列(六)延时对象应用之jQuery.ready
2015/11/24 Javascript
利用JavaScript实现拖拽改变元素大小
2016/12/14 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
2017/01/20 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
解决React在安装antd之后出现的Can't resolve './locale'问题(推荐)
2020/05/03 Javascript
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
Django中的forms组件实例详解
2018/11/08 Python
python3.6环境安装+pip环境配置教程图文详解
2019/06/20 Python
Python (Win)readline和tab补全的安装方法
2019/08/27 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
CSS3 简写animation
2012/05/10 HTML / CSS
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
Michael Kors澳大利亚官网:世界知名的奢侈饰品和成衣设计师
2020/02/13 全球购物
服装设计行业个人的自我评价
2013/12/20 职场文书
称象教学反思
2014/02/03 职场文书
品德评语大全
2014/05/05 职场文书
安全生产演讲稿
2014/05/09 职场文书
高三霸气励志标语
2014/06/24 职场文书
首席执行官观后感
2015/06/03 职场文书
大学生社会实践感想
2015/08/11 职场文书
初中班主任培训心得体会
2016/01/07 职场文书
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
2022/04/13 Java/Android
解决Python保存文件名太长OSError: [Errno 36] File name too long
2022/05/11 Python
Redis基本数据类型String常用操作命令
2022/06/01 Redis
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL