phpredis使用rpoplpush時出現read error on connection

最近使用redisLists資料結構做些東西,採用Reliable queue這Pattern。

我開發環境的語言是PHP,連接redis的套件,採用phpredis/phpredis: A PHP extension for Redis這套。

雛形很快的就開發好了,沒想到,一測試就遇到以下的錯誤…程式無法達到預期-持續的連接於redis接收Lists內的資料。

RedisException: read error on connection in XXXXX.php

由於我是使用brpoplpush這指令操作,不經懷疑blocking的操作方式會受redis.conf中的timeout參數的影響。當初,考量redis的運作方式,因此刻意調整此參數避免redis被單一client卡住。畢竟設定檔中的timeout參數是這樣說明的…
# Close the connection after a client is idle for N seconds (0 to disable)
timeout 0
於是,我將主機的設定調整回預設的0。沒想到,錯誤依舊發生…

問了google大神,網路上一堆文章提調整PHP default_socket_timeout即可解決。照他們的解釋,此解決方案似乎可行。不過,就我測試結果,此法依舊無效、錯誤依舊發生…

最後,參考connect set timeout cause blpop not work · Issue #440 · phpredis/phpredis · GitHub 這文章,終於把問題解決了。

原來,我使用phpredis connect開啟redis連線時,都會設定timeout避免異常狀況發生時程式一直卡在連線。而使用brpoplpush時,我也有設定timeout。

很巧的,我於brpoplpush所設定的timeout時間,大於phpredis connect的timeout。因此發生了錯誤…

此問題的解決方案,就是將brpoplpush的timeout時間,小於phpredis connect的timeout即可。

後記:發現新版的phpredis connect有多一個read_timeout的參數。尚不清楚是否也會有影響?


相關文章


留言