1. 问题现象

系统页面刷新的时候,偶尔会报错下面的Warnning,但是不经常出现:
Warning: Unknown: Failed to write session data (Redis). Please verify that the current setting of session.save_path is correct (tcp://x.x.x.x:6379?auth=yyy) in Unknown on line 0
看网络有人说是redis版本的问题、但是没有具体结论,那么本着学习的态度,自己试试看看能不能捉出这个bug.
定位问题:
查看PHP文件是否有设置session的地方,发现没有
继续检查php配置文件,发现配置了session存储到redis里面
[Session] session.save_handler = redis session.save_path = "tcp://x.x.x.x:6379?auth=yyyy" session.use_cookies = 1
1、继续查看php Session扩展源代码,定位出错提示语在函数php_session_save_current_state中
检查session扩展文件中出错提示:
static void php_session_save_current_state(TSRMLS_D) /* {{{ */
{
int ret = FAILURE;
//是否session数组
IF_SESSION_VARS() {
if (PS(mod_data) || PS(mod_user_implemented)) {
char *val;
int vallen;
//变量编码
val = php_session_encode(&vallen TSRMLS_CC);
if (val) {
//保存session数据
ret = PS(mod)->s_write(&PS(mod_data), PS(id), val, vallen TSRMLS_CC);
efree(val);
} else {
//清空session
ret = PS(mod)->s_write(&PS(mod_data), PS(id), "", 0 TSRMLS_CC);
}
}
//看出错提示语在这里
if (ret == FAILURE) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to write session data (%s). Please "
"verify that the current setting of session.save_path "
"is correct (%s)",
PS(mod)->s_name,
PS(save_path));
}
}
if (PS(mod_data) || PS(mod_user_implemented)) {
PS(mod)->s_close(&PS(mod_data) TSRMLS_CC);
}
}
static void php_session_flush(TSRMLS_D){
如果 (PS(session_status) == php_session_active)
session_status = none
这里调用...
php_session_save_current_state
}
下面两个函数调用:php_session_flush()
static PHP_FUNCTION(session_write_close)
{
php_session_flush(TSRMLS_C);
}
static PHP_FUNCTION(session_register_shutdown){
}
由上面可以看到,php_session_save_current_state是在 php_session_flush中调用,即在session保存、清空等刷新写session的时候会产生。
由php seesion源码没有发现什么问题,突然想到会不会是Redis本身有没有啥问题,导致的写出错。因而继续从redis里面找问题:
Redis问题定位
1. 首先查看Redis日志文件:
看到如下每5分钟会刷新一下如下log:
[16723] 04 Jul 15:15:01.987 # Server started, Redis version 2.8.9 [16723] 04 Jul 15:15:01.987 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. [16723] 04 Jul 15:15:01.996 * DB loaded from disk: 0.008 seconds [16723] 04 Jul 15:15:01.996 * The server is now ready to accept connections on port 6379
怀疑这就是问题的PHP写日志失败的原因了。那么Redis为啥会5分钟重启呢?继续追查!
2. 是系统内存不够、Redis core了?
查看系统和Redis内存使用状态:
系统内存状态:
$ free -m
total used free shared buffers cached
Mem: 3516 3171 345 0 684 1680
-/+ buffers/cache: 806 2709
Swap: 2055 724 1330
Redis服务器占用的内存状态:
used_memory:2841648 used_memory_human:2.71M used_memory_rss:3710976 used_memory_peak:2877576 used_memory_peak_human:2.74M used_memory_lua:33792 mem_fragmentation_ratio:1.31 mem_allocator:jemalloc-3.2.0
可以看到Redis其实内存占用非常少。redis重启原因暂且不明。
3. 定时脚本
因为重启日志5分钟一次、非常规律,因而怀疑是不是别的原因导致Redis重启,比如定时脚本。
因为本人没有root corntab权限,找老板提权,看到赫然存在着一个crontab,5分钟监控一次redis。
如下:
/5 * * * /data/scripts/check_redis.sh >/dev/null 2>&1 ##check_redis.tag.1
查看脚本内容
PORT='6379'
ETH1_ADDR=`/sbin/ifconfig eth1 | awk -F ':' '/inet addr/{print $2}' | sed 's/[a-zA-Z ]//g'`
retval=`nmap --system-dns -sT -p ${PORT} ${ETH1_ADDR} | grep open`
if [ "${retval}X" = "X" ]; then
/sbin/service redis restart >/dev/null 2>&1
fi
这是一个检查Redis端口是否提供服务的脚本,如果检查不成功,就拉起Redis。
可以看到这个脚本本来没有什么问题。
但是:通过手动执行这个命令发现:
这台机器没有安装nmap 这个命令,
所以这个脚本最后总是执行失败!然后Redis重启。
因为问题根源找到了,找运维安装相关命令,问题解决。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# PHP使用Redis存储session
# PHP存储session定位
# Redis 的 GeoHash详解
# 重启
# 可以看到
# 什么问题
# 清空
# 是在
# 在这里
# 这就是
# 会不会
# 这是一个
# 报错
# 拉起
# 不成功
# 即在
# 这台
# 配置文件
# 源代码
# 大家多多
# 没有安装
# 找到了
# E_WARNING
相关文章:
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
,怎么用自己头像做动态表情包?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
头像制作网站在线制作软件,dw网页背景图像怎么设置?
如何制作一个表白网站视频,关于勇敢表白的小标题?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
制作企业网站建设方案,怎样建设一个公司网站?
如何自定义建站之星网站的导航菜单样式?
专业商城网站制作公司有哪些,pi商城官网是哪个?
建站之星安装路径如何正确选择及配置?
安云自助建站系统如何快速提升SEO排名?
建站主机如何选?性能与价格怎样平衡?
如何在宝塔面板中创建新站点?
深圳网站制作培训,深圳哪些招聘网站比较好?
建站主机SSH密钥生成步骤及常见问题解答?
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
建站之星备案是否影响网站上线时间?
建站之家VIP精选网站模板与SEO优化教程整合指南
c# 在高并发下使用反射发射(Reflection.Emit)的性能
建站之星如何配置系统实现高效建站?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
如何在腾讯云免费申请建站?
如何挑选优质建站一级代理提升网站排名?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
文字头像制作网站推荐软件,醒图能自动配文字吗?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
如何在橙子建站上传落地页?操作指南详解
Python路径拼接规范_跨平台处理说明【指导】
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
韩国服务器如何优化跨境访问实现高效连接?
制作表格网站有哪些,线上表格怎么弄?
建站主机选购指南:核心配置与性价比推荐解析
如何用景安虚拟主机手机版绑定域名建站?
微信小程序 五星评分(包括半颗星评分)实例代码
建站之星云端配置指南:模板选择与SEO优化一键生成
Bpmn 2.0的XML文件怎么画流程图
如何通过主机屋免费建站教程十分钟搭建网站?
定制建站策划方案_专业建站与网站建设方案一站式指南
如何零基础在云服务器搭建WordPress站点?
电商网站制作价格怎么算,网上拍卖流程以及规则?
SQL查询语句优化的实用方法总结
建站之星如何修改网站生成路径?
为什么Go需要go mod文件_Go go mod文件作用说明
*请认真填写需求信息,我们会在24小时内与您取得联系。