Memcached::get(): could not uncompress value的錯誤

同事提到一個問題,他的程式到memcache取資料時,都會出現如下的錯誤訊息…
Memcached::get(): could not uncompress value

當下的第一個反應,先查看產生資料塞到memcache的程式,是否有開啟壓縮功能?

查過後,確認程式有設定Memcached::OPT_COMPRESSION參數,關閉壓縮資料的功能(關掉壓縮功能,是為了和其他不能升級的系統相容 :()

這就神奇了…明明有設定不壓縮,卻還是出現和壓縮有關的錯誤?

抽絲剝繭後,不經懷疑是不是新版的memcache還是會自動壓縮?(memcached 2.0 開始,有不少異動。有興趣可以參考Changelog for memcached

因為,最後的解法是在產生資料塞到memcache的程式所在的主機,於php.ini中,增加memcached.compression_threshold這個參數。把預設值2000調的更高,避免壓縮。以下,為memcached.compression_threshold的定義
The compression threshold. Do not compress serialized values below this threshold. The default is 2000 bytes.
問題雖然是解決了,不過…為何明明有使用Memcached::OPT_COMPRESSION disable compression,卻還是壓縮?奇怪…

附註:
  • 取memcache資料的程式所在的主機,是使用memcached 1.0.x版。
  • 產生資料的主機使用memcached 2.x版。
  • 當產生資料/ 取資料都使用相同版本memcached 時,都不會有問題。
  • memcached.compression_threshold的解釋中,是使用"serialized values"這樣的字眼。不過,我看程式中傳入memcache的內容為html,html不算是單純字串嗎?

留言