PHP使用Redis存储session时的一个Warning定位详解

本文主要和大家介绍了php使用redis存储session时的一个warning定位,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。

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免费学习笔记(深入)”;

定位问题:

查看PHP文件是否有设置session的地方,发现没有

继续检查php配置文件,发现配置了session存储到redis里面

[Session]session.save_handler = redissession.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   cachedMem:     3516    3171    345     0    684    1680-/+ buffers/cache:    806    2709Swap:     2055    724    1330

登录后复制

Redis服务器占用的内存状态:

used_memory:2841648used_memory_human:2.71Mused_memory_rss:3710976used_memory_peak:2877576used_memory_peak_human:2.74Mused_memory_lua:33792mem_fragmentation_ratio:1.31mem_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>&1fi

登录后复制

这是一个检查Redis端口是否提供服务的脚本,如果检查不成功,就拉起Redis。

可以看到这个脚本本来没有什么问题。

但是:通过手动执行这个命令发现:

这台机器没有安装nmap 这个命令,

所以这个脚本最后总是执行失败!然后Redis重启。

因为问题根源找到了,找运维安装相关命令,问题解决。

相关推荐:

redis 存储session的实例

php Redis存储Session

php调用memcache存储session

以上就是PHP使用Redis存储session时的一个Warning定位详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2110903.html

(0)
上一篇 2025年2月24日 15:55:55
下一篇 2025年2月24日 15:56:08

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Dubbo 配置中端口、注册中心和属性的常见问题解答

    理解 Dubbo 配置中的端口、注册中心和属性 本文旨在解答以下关于 Dubbo 配置文件中常见元素的疑问: 1. registry 中的 protocol 和外部的 protocol 的区别 Dubbo 配置文件中的 registry 标…

    2025年3月14日
    200
  • swoole自学入门教程

    Swoole是一种PHP Web服务器和应用程序框架,具有高性能和协程化特质。通过本教程,你可以了解到如何在PHP中安装和使用Swoole,包括创建HTTP服务器、使用协程和实现WebSocket通信。此外,Swoole还提供了数据库连接池…

    2025年3月13日
    200
  • workerman手册

    Workerman是一个异步事件驱动框架,用于开发高性能网络应用。其特点包括高性能、低内存消耗、易于使用和可扩展。它广泛应用于即时通讯、WebSocket服务、高并发HTTP服务等场景。使用时可创建Worker类,并调用run()函数运行W…

    2025年3月13日
    200
  • laravel8 的优化点

    Laravel 8 针对性能优化提供了以下选项:缓存配置:使用 Redis 缓存驱动、缓存门面、缓存视图和页面片段。数据库优化:建立索引、使用查询范围、使用 Eloquent 关系。JavaScript 和 CSS 优化:使用版本控制、合并…

    2025年3月13日
    200
  • 如何高效持久化多个客户端连续上传的坐标轨迹数据?

    应对海量坐标轨迹数据持久化挑战 本文探讨如何高效持久化多个客户端连续上传的坐标轨迹数据,并提供两种方案以应对不同场景的需求。 方案一:字符串拼接法(适用于轨迹较短的场景) 此方案将每秒接收到的坐标数据拼接成一个字符串,然后存储到数据库。 然…

    2025年3月13日
    200
  • Linux平台Swagger性能如何优化

    提升Linux平台Swagger性能,需要多方面策略协同。本文将介绍几种常见的优化方法: 一、硬件资源升级 内存扩容: 更大的内存直接提升Swagger响应速度。CPU升级: 更强大的CPU能更快处理请求。SSD硬盘: SSD的I/O性能远…

    2025年3月13日
    200
  • Linux上Swagger工具使用有哪些技巧

    本文介绍在Linux系统下提升Swagger工具使用效率和安全性的实用技巧。 保持Swagger版本更新: 使用最新稳定版Swagger,例如Springfox的最新版本,以确保最佳性能和安全性。 增强安全性:密码保护与身份验证: 为Swa…

    2025年3月13日
    200
  • 做为一名优秀的php工程师,这些 Linux 指令你都掌握了吗?

    前言 本文收录了 linux 常用指令,这里面有个小技巧,基本上所有指令后面跟上 –h 可以显示其使用方法。故不必死记硬背,知其意乃通其形。(推荐:Linux视频教程) 分类如下:  ● 文件 & 目录操作(16 个) …

    2025年3月13日
    400
  • 使用PHP和Vue.js构建快速响应式 Web 应用程序

    在当今的时代,web 应用程序需要快速响应和高效的交互特性来满足用户的需求。为此,php 和 vue.js 成为了两个广泛使用的工具,用于构建快速响应式的 web 应用程序。 PHP 是一种流行的服务器端脚本语言,它可以协助 Web 开发人…

    编程技术 2025年3月13日
    200
  • 如何在PHP中实现爬虫功能

    在互联网时代,信息获取已经成为人们日常生活中的重要部分。然而,与此同时,人们也需要处理大量的信息以提取重要的数据。这就促使出现了“爬虫”这个概念。爬虫,又称网络蜘蛛,是一种按照特定规则自动获取网页信息的程序。在php中,实现爬虫功能可以采用…

    编程技术 2025年3月13日
    200

发表回复

登录后才能评论