本文為原創,轉載請註明出處。

昨天在ubuntu上安裝完yar之後發現yar還是不能用,感覺有些不對勁。

通過在微博上請教 大神和公司的大大之後,問題解決了,下面就來分享這一成果。

如果還沒有做好安裝工作,請看我的上一篇文章,戳這裡

前面的文章提到,我在安裝完yar之後,在phpinfo()中並沒有看到擴充套件。

同樣的,在函式 extension_loaded("yar")  的證明下,也證明沒有安裝成功。

那麼,這到底是為什麼呢?

首先,開啟 display_startup_errors

開啟方式有兩種。

第一,修改php.ini ,新增 display_startup_errors = On

第二,在php檔案中動態設定。 ini_set(‘display_startup_errors’,1);

然後檢視錯誤日誌。

我的Ubuntu的錯誤日誌在 var/log/apache2 ,如果你也和我一樣一開始找不到,那麼就去翻phpinfo(),在 Environment 下的 APACHE_LOG_DIR,就是系統日誌哦。

檢視日誌

然後我發現了這樣的錯誤。

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20121212/yar.so' - /usr/lib/php5/20121212/yar.so: undefined symbol: php_json_decode_ex in Unknown on line 0

這個的意思,就是,沒法載入yar.so,json也沒載入上啊阿魯。

這時候,公司的大大告訴我,他在網上也找到了和我相似遭遇的小夥伴。


大概理解下,就是說,天啦嚕,這裡有個BUG呀,json的載入方式是通過json.ini中載入的,而php會首先載入php.ini,這樣json的載入就會放到最後,但是,memcached的載入必須放到json的後面啊。

問題分析

恩恩,就是這樣。

php的載入方式為首先載入php.ini,載入完php.ini中的設定和擴充套件後,再去載入json.ini,在讀取json.ini中,載入了json這個擴充套件。

這樣就造成了,json是最後載入上的,但是不行,我們的一些擴充套件的載入順序必須放到json之後。

問題解決

在php.ini中,我們手動將 extension=json.so 寫入,讓它提前載入,這樣就不會觸發bug啦。

extension=json.so
extension=msgpack.so
extension=yar.so

重啟apache,開啟pphinfo(),就能看見鳥哥的大作啦。

yar

至此,基於RPC的php擴充套件安裝正式完成!

後記

學習依舊是一個不斷探索、不斷出錯、不斷改正、不斷進步的過程。

我們會越來越強大~!