最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年07月05日 09:36:08   作者:Junsg  
本篇文章主要介紹了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)絡有人說是redis版本的問題、但是沒有具體結(jié)論,那么本著學習的態(tài)度,自己試試看看能不能捉出這個bug.

定位問題:

查看PHP文件是否有設置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擴展源代碼,定位出錯提示語在函數(shù)php_session_save_current_state中

檢查session擴展文件中出錯提示:

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本身有沒有啥問題,導致的寫出錯。因而繼續(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服務器占用的內(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其實內(nèi)存占用非常少。redis重啟原因暫且不明。

3. 定時腳本

因為重啟日志5分鐘一次、非常規(guī)律,因而懷疑是不是別的原因?qū)е翿edis重啟,比如定時腳本。

因為本人沒有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端口是否提供服務的腳本,如果檢查不成功,就拉起Redis。

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

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

這臺機器沒有安裝nmap 這個命令,

所以這個腳本最后總是執(zhí)行失?。∪缓驲edis重啟。

因為問題根源找到了,找運維安裝相關命令,問題解決。

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

您可能感興趣的文章:

相關文章

  • PHP數(shù)組去重比較快的實現(xiàn)方式

    PHP數(shù)組去重比較快的實現(xiàn)方式

    使用PHP的array_unique()函數(shù)允許你傳遞一個數(shù)組,然后移除重復的值,返回一個擁有唯一值的數(shù)組,通過本文給大家介紹PHP數(shù)組去重比較快的實現(xiàn)方式,需要的朋友參考下本文
    2016-01-01
  • Zend Framework入門應用實例詳解

    Zend Framework入門應用實例詳解

    這篇文章主要介紹了Zend Framework入門應用,結(jié)合實例形式詳細講述了Zend Framework應用的創(chuàng)建步驟、相關命令、控制器及視圖文件代碼實現(xiàn)技巧,需要的朋友可以參考下
    2016-12-12
  • PHP生成各種常見驗證碼和Ajax驗證過程

    PHP生成各種常見驗證碼和Ajax驗證過程

    本文將通過實例講解使用PHP生成各種常見的驗證碼包括數(shù)字驗證碼、數(shù)字+字母驗證碼、中文驗證碼、算術驗證碼等等以及其Ajax驗證過程
    2016-01-01
  • laravel 多圖上傳及圖片的存儲例子

    laravel 多圖上傳及圖片的存儲例子

    今天小編就為大家分享一篇laravel 多圖上傳及圖片的存儲例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • 基于PHP-FPM進程池探秘

    基于PHP-FPM進程池探秘

    下面小編就為大家?guī)硪黄赑HP-FPM進程池探秘。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • PHP Yaf框架的簡單安裝使用教程(推薦)

    PHP Yaf框架的簡單安裝使用教程(推薦)

    下面小編就為大家?guī)硪黄狿HP Yaf框架的簡單安裝使用教程(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • 解決PHPstudy Apache無法啟動的問題【親測有效】

    解決PHPstudy Apache無法啟動的問題【親測有效】

    這篇文章主要介紹了PHPstudy Apache無法啟動的問題及解決方法【親測有效】,本文給大家總結(jié)了三種方法供大家參考,需要的朋友可以參考下
    2020-10-10
  • Symfony2實現(xiàn)在doctrine中內(nèi)置數(shù)據(jù)的方法

    Symfony2實現(xiàn)在doctrine中內(nèi)置數(shù)據(jù)的方法

    這篇文章主要介紹了Symfony2實現(xiàn)在doctrine中內(nèi)置數(shù)據(jù)的方法,結(jié)合實例形式分析了在doctrine中內(nèi)置數(shù)據(jù)的具體步驟與相關技巧,需要的朋友可以參考下
    2016-02-02
  • php版微信自動獲取收貨地址api用法示例

    php版微信自動獲取收貨地址api用法示例

    這篇文章主要介紹了php版微信自動獲取收貨地址api用法,結(jié)合實例形式分析了php版微信API接口調(diào)用與使用技巧,需要的朋友可以參考下
    2016-09-09
  • php-msf源碼詳解

    php-msf源碼詳解

    這篇文章主要介紹了php-msf源碼的意思以及用法相關問題,有需要的朋友跟著參考學習下吧。
    2017-12-12

最新評論

汝阳县| 海口市| 开化县| 晋中市| 通山县| 湟中县| 黔西县| 榆林市| 内丘县| 紫云| 鄱阳县| 夏邑县| 武胜县| 义马市| 江安县| 安溪县| 昌江| 鄂温| 夏邑县| 清流县| 南汇区| 通海县| 福建省| 普格县| 满城县| 苍溪县| 仙游县| 云南省| 安平县| 绿春县| 台北市| 枞阳县| 获嘉县| 军事| 威远县| 盈江县| 博湖县| 包头市| 齐河县| 宝鸡市| 嘉黎县|