pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

詳解PHP使用Redis存儲session時的一個Warning定位

本篇文章主要介紹了PHP使用Redis存儲session時的一個Warning定位,具有一定的參考價值,感興趣的小伙伴們可以參考一下

1. 問題現(xiàn)象

系統(tǒng)頁面刷新的時候,偶爾會報錯下面的Warnning,但是不經(jīng)常出現(xiàn):

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

看網(wǎng)絡(luò)有人說是redis版本的問題、但是沒有具體結(jié)論,那么本著學(xué)習(xí)的態(tài)度,自己試試看看能不能捉出這個bug.

定位問題:

查看PHP文件是否有設(shè)置session的地方,發(fā)現(xiàn)沒有

繼續(xù)檢查php配置文件,發(fā)現(xiàn)配置了session存儲到redis里面

[Session]
session.save_handler = redis
session.save_path = "tcp://x.x.x.x:6379?auth=yyyy"
session.use_cookies = 1

1、繼續(xù)查看php Session擴(kuò)展源代碼,定位出錯提示語在函數(shù)php_session_save_current_state中

檢查session擴(kuò)展文件中出錯提示:

static void php_session_save_current_state(TSRMLS_D) /* {{{ */
{
  int ret = FAILURE;

  //是否session數(shù)組
  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數(shù)據(jù)
        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

    這里調(diào)用...
    php_session_save_current_state
}

下面兩個函數(shù)調(diào)用: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中調(diào)用,即在session保存、清空等刷新寫session的時候會產(chǎn)生。

由php seesion源碼沒有發(fā)現(xiàn)什么問題,突然想到會不會是Redis本身有沒有啥問題,導(dǎo)致的寫出錯。因而繼續(xù)從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分鐘重啟呢?繼續(xù)追查!

2. 是系統(tǒng)內(nèi)存不夠、Redis core了?

查看系統(tǒng)和Redis內(nèi)存使用狀態(tài):

系統(tǒng)內(nèi)存狀態(tài):

$ free -m
       total    used    free   shared  buffers   cached
Mem:     3516    3171    345     0    684    1680
-/+ buffers/cache:    806    2709
Swap:     2055    724    1330

Redis服務(wù)器占用的內(nèi)存狀態(tài):

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其實(shí)內(nèi)存占用非常少。redis重啟原因暫且不明。

3. 定時腳本

因?yàn)橹貑⑷罩?分鐘一次、非常規(guī)律,因而懷疑是不是別的原因?qū)е翿edis重啟,比如定時腳本。

因?yàn)楸救藳]有root corntab權(quán)限,找老板提權(quán),看到赫然存在著一個crontab,5分鐘監(jiān)控一次redis。

如下:

/5 * * * /data/scripts/check_redis.sh >/dev/null 2>&1 ##check_redis.tag.1

查看腳本內(nèi)容

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端口是否提供服務(wù)的腳本,如果檢查不成功,就拉起Redis。

可以看到這個腳本本來沒有什么問題。

但是:通過手動執(zhí)行這個命令發(fā)現(xiàn):

這臺機(jī)器沒有安裝nmap 這個命令,

所以這個腳本最后總是執(zhí)行失敗!然后Redis重啟。

因?yàn)閱栴}根源找到了,找運(yùn)維安裝相關(guān)命令,問題解決。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持。

【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過測試外,其他素材未做測試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請勿用于商業(yè)用途。如損害你的權(quán)益請聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

主站蜘蛛池模板: 篮球架_乒乓球台_足球门_校园_竞技体育器材_厂家_价格-沧州浩然体育器材有限公司 | 合肥仿石砖_合肥pc砖厂家_合肥PC仿石砖_安徽旭坤建材有限公司 | 仿真茅草_人造茅草瓦价格_仿真茅草厂家_仿真茅草供应-深圳市科佰工贸有限公司 | 涡轮流量计_LWGY智能气体液体电池供电计量表-金湖凯铭仪表有限公司 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 回转窑-水泥|石灰|冶金-巩义市瑞光金属制品有限责任公司 | 最新范文网_实用的精品范文美文网| 自进式锚杆-自钻式中空注浆锚杆-洛阳恒诺锚固锚杆生产厂家 | 玻璃瓶厂家_酱菜瓶厂家_饮料瓶厂家_酒瓶厂家_玻璃杯厂家_徐州东明玻璃制品有限公司 | 管家婆-管家婆软件-管家婆辉煌-管家婆进销存-管家婆工贸ERP | 阜阳在线-阜阳综合门户 | 诚暄电子公司首页-线路板打样,pcb线路板打样加工制作厂家 | 塑料造粒机「厂家直销」-莱州鑫瑞迪机械有限公司 | 贵州水玻璃_-贵阳花溪闽兴水玻璃厂 | PAS糖原染色-CBA流式多因子-明胶酶谱MMP-上海研谨生物科技有限公司 | 上海璟文空运首页_一级航空货运代理公司_机场快递当日达 | 小学教案模板_中学教师优秀教案_高中教学设计模板_教育巴巴 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 潜水搅拌机-双曲面搅拌机-潜水推进器|奥伯尔环保 | pos机办理,智能/扫码/二维码/微信支付宝pos机-北京万汇通宝商贸有限公司 | 上海防爆真空干燥箱-上海防爆冷库-上海防爆冷柜?-上海浦下防爆设备厂家? | 小型玉石雕刻机_家用玉雕机_小型万能雕刻机_凡刻雕刻机官网 | 气动调节阀,电动调节阀,自力式压力调节阀,切断阀「厂家」-浙江利沃夫自控阀门 | 超声波乳化机-超声波分散机|仪-超声波萃取仪-超声波均质机-精浩机械|首页 | 广州各区危化证办理_危险化学品经营许可证代办 | 真空冷冻干燥机_国产冻干机_冷冻干燥机_北京四环冻干 | 黄石东方妇产医院_黄石妇科医院哪家好_黄石无痛人流医院 | 长春网站建设,五合一网站设计制作,免费优化推广-长春网站建设 | 浙江宝泉阀门有限公司| 绿萝净除甲醛|深圳除甲醛公司|测甲醛怎么收费|培训机构|电影院|办公室|车内|室内除甲醛案例|原理|方法|价格立马咨询 | 高楼航空障碍灯厂家哪家好_航空障碍灯厂家_广州北斗星障碍灯有限公司 | 辊道窑炉,辊道窑炉厂家-山东艾希尔 | 海水晶,海水素,海水晶价格-潍坊滨海经济开发区强隆海水晶厂 | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 | 土壤有机碳消解器-石油|表层油类分析采水器-青岛溯源环保设备有限公司 | 不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰]-不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰] | 网优资讯-为循环资源、大宗商品、工业服务提供资讯与行情分析的数据服务平台 | 膏方加工_丸剂贴牌_膏滋代加工_湖北康瑞生物科技有限公司 | 2025福建平潭岛旅游攻略|蓝眼泪,景点,住宿攻略-趣平潭网 | 电位器_轻触开关_USB连接器_广东精密龙电子科技有限公司 |