本文为原创,转载请注明出处。
昨天在ubuntu上安装完yar之后发现yar还是不能用,感觉有些不对劲。
通过在微博上请教 @Laruence 大神和公司的大大之后,问题解决了,下面就来分享这一成果。
如果还没有做好安装工作,请看我的上一篇文章,戳这里。
前面的文章提到,我在安装完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
这时候,公司的大大告诉我,他在网上也找到了和我相似遭遇的小伙伴。
大概理解下,就是说,天啦噜,这里有个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
至此,基于RPC的php扩展安装正式完成!
后记
学习依旧是一个不断探索、不断出错、不断改正、不断进步的过程。
我们会越来越强大~!