关于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 相关文章推荐
dedecms 制作模板中使用的全局标记图文教程
Mar 11 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
Feb 17 PHP
基于MySQL到MongoDB简易对照表的详解
Jun 03 PHP
php实现批量下载百度云盘文件例子分享
Apr 10 PHP
php图形jpgraph操作实例分析
Feb 22 PHP
Thinkphp5结合layer弹窗定制操作结果页面
Jul 07 PHP
PHP运用foreach神奇的转换数组(实例讲解)
Feb 01 PHP
laravel中短信发送验证码的实现方法
Apr 25 PHP
php 可变函数使用小结
Jun 12 PHP
PHP时间处理类操作示例
Sep 05 PHP
php5与php7的区别点总结
Oct 11 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
Jun 24 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轻松实现中英文混排字符串截取
2014/05/28 PHP
PHP实现简单实用的验证码类
2015/07/29 PHP
浅谈PHP的反射API
2017/02/26 PHP
Laravel实现定时任务的示例代码
2017/08/10 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
2017/10/26 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
json跟xml的对比分析
2008/06/10 Javascript
读jQuery之一(对象的组成)
2011/06/11 Javascript
取得窗口大小 兼容所有浏览器的js代码
2011/08/09 Javascript
基于jQuery实现图片的前进与后退功能
2013/04/24 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
2013/04/27 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
jQuery设置指定网页元素宽度和高度的方法
2015/03/25 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
使用jQuery处理AJAX请求的基础学习教程
2016/05/10 Javascript
利用JavaScript将Excel转换为JSON示例代码
2019/06/14 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
Python配置文件解析模块ConfigParser使用实例
2015/04/13 Python
python xpath获取页面注释的方法
2019/01/14 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
详解python polyscope库的安装和例程
2020/11/13 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
2021/02/18 Python
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
iHerb台湾:维生素、保健品和健康产品
2018/01/31 全球购物
介绍一下木马病毒的种类
2015/07/26 面试题
银行实习自我鉴定
2013/10/12 职场文书
水利学院求职自荐书
2014/02/01 职场文书
党建工作经验交流材料
2014/05/25 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL