phpredis使用rpoplpush時出現read error on connection
最近使用redis的Lists資料結構做些東西,採用Reliable queue這Pattern。
我開發環境的語言是PHP,連接redis的套件,採用phpredis/phpredis: A PHP extension for Redis這套。
雛形很快的就開發好了,沒想到,一測試就遇到以下的錯誤…程式無法達到預期-持續的連接於redis接收Lists內的資料。
由於我是使用brpoplpush這指令操作,不經懷疑blocking的操作方式會受redis.conf中的timeout參數的影響。當初,考量redis的運作方式,因此刻意調整此參數避免redis被單一client卡住。畢竟設定檔中的timeout參數是這樣說明的…
問了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的參數。尚不清楚是否也會有影響?
我開發環境的語言是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)於是,我將主機的設定調整回預設的0。沒想到,錯誤依舊發生…
timeout 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的參數。尚不清楚是否也會有影響?
相關文章
- connect set timeout cause blpop not work · Issue #440 · phpredis/phpredis · GitHub
- Should `timeout` be `read_timeout`? · Issue #795 · phpredis/phpredis · GitHub
留言