php出現Memcached::get(): could not unserialize value, no igbinary support的錯誤

之前一直注意到有個系統的錯誤log中斷斷續續出現如下的錯誤資訊。由錯誤研判,應該是放進memcache的內容有使用Igbinary。但是取出時,卻沒做對應的處理。
Severity: Warning --> Memcached::get(): could not unserialize value, no igbinary support /xxx/xxx.php

曾請當時負責維護的苦主同事查看,得到的答案是程式中並沒有使用igbinary

最近在協助查另一個問題時,卻間接找到這個問題發生原因……

原來是因為,當程式將物件傳入memcache時,我們所使用的memcached會自動將物件做serialize。

memcached Runtime Configuration中提到,memcached有個memcached.serializer參數可控制寫入memcache的格式,目前有以下四種
  1. json
  2. json_array
  3. php
  4. igbinary
預設採用igbinary。但是,當主機上沒有安裝igbinary時,則會改用php模式(standard PHP serializer)。

知道可能的原因,就好處理了~比對了log,以及主機上所安裝的套件,果然是因為該系統的眾多主機中,有台主機沒有安裝Igbinary。因此,當該主機的程式由memcache取回資料時,因無法使用Igbinary而發生錯誤。

最後提一下,原本是打算將該主機上安裝Igbinary以解決這問題。但是考慮未來打算升級到PHP7,而Igbinary目前僅相容PHP5(Compatible with PHP 5.2 – 5.6)。因此,最後統一改為使用php模式(standard PHP serializer)來解決。

留言