php cli配置文件问题分析
引言
今天在教别人使用protobuf的时候,无意中发现了一个phpcli模式下的诡异问题,费了老半天的找到解决方法了,这里拿出来分享下。
问题描述
我们这边最先引入了protobuf协议,使用的是allegro/php-protobuf这个扩展安装的。这几天其他同事也要用到这个,于是我将protobuf生成php类库文件的部分放到了一个公共的位置/data/php_proto/文件夹下,里面有这些内容,
drwsrwxr-x2yanruitaousers409610月1417:05Dmp
-rwxrwxr-x1yanruitaousers 47210月1017:59dmp.proto
drwsrwxr-x2yanruitaousers409610月1017:54ProtobufCompiler
-rwxrwxr-x1yanruitaousers29693月 92015protoc-php.php
后面两个是必须的,生成pb协议实现类库文件时会用到,前面两个是一个简单的例子,使用也很简单,就像下面这样。
phpprotoc-php.php-n--psrdmp.proto//-n是使用命名空间,--psr是使用psr-4标准等同事用的时候发现会报错,
PHPWarning: file_put_contents(pb_proto_dmp.php):failedtoopenstream:Permissiondeniedin/data/php_proto/ProtobufCompiler/ProtobufParser.phponline309
同事问我的时候我直接说,加上sudo就可以了,结果加上sudo问题更严重了,本来装好的扩展程序加载不成功,经过一番排查发下有下面这么一个问题:
$yanruitao:php-i|grep'php.ini'
$yanruitao:sudophp-i|grep'php.ini'
两种用户加载的不是同一个配置文件,普通用户加载的是/usr/local/php/lib/php.ini,而root用户加载的是/etc/php.ini这个文件,我看了下这两个文件内容不一致,哈哈,好开心,赶紧把先把/etc/php.ini备份,/usr/local/php/lib/php.ini复制到/etc/php.ini,复制完了之后,我再使用的时候吓我一跳,报了一大堆错误:
PHPWarning: PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/web_stub_cntl.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/web_stub_cntl.so:undefinedsymbol:zend_new_interned_stringinUnknownonline0
Warning:PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/web_stub_cntl.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/web_stub_cntl.so:undefinedsymbol:zend_new_interned_stringinUnknownonline0
PHPWarning: PHPStartup:test:Unabletoinitializemodule
ModulecompiledwithmoduleAPI=20100525
PHP compiledwithmoduleAPI=20090626
Theseoptionsneedtomatch
inUnknownonline0
Warning:PHPStartup:test:Unabletoinitializemodule
ModulecompiledwithmoduleAPI=20100525
PHP compiledwithmoduleAPI=20090626
Theseoptionsneedtomatch
inUnknownonline0
PHPWarning: PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/protobuf.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/protobuf.so:undefinedsymbol:zend_new_interned_stringinUnknownonline0
Warning:PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/protobuf.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/protobuf.so:undefinedsymbol:zend_new_interned_stringinUnknownonline0
PHPWarning: PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/imagick.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/imagick.so:undefinedsymbol:zend_new_interned_stringinUnknownonline0
Warning:PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/imagick.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/imagick.so:undefinedsymbol:zend_new_interned_stringinUnknownonline0
PHPWarning: PHPStartup:Unabletoloaddynamiclibrary'/data/boss/phpredis-develop/modules/redis.so'-/data/boss/phpredis-develop/modules/redis.so:undefinedsymbol:zend_new_interned_stringinUnknownonline0
Warning:PHPStartup:Unabletoloaddynamiclibrary'/data/boss/phpredis-develop/modules/redis.so'-/data/boss/phpredis-develop/modules/redis.so:undefinedsymbol:zend_new_interned_stringinUnknownonline0
PHPWarning: PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/curl.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/curl.so:cannotopensharedobjectfile:NosuchfileordirectoryinUnknownonline0
Warning:PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/curl.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/curl.so:cannotopensharedobjectfile:NosuchfileordirectoryinUnknownonline0
PHPWarning: PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/fileinfo.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/fileinfo.so:cannotopensharedobjectfile:NosuchfileordirectoryinUnknownonline0
Warning:PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/fileinfo.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/fileinfo.so:cannotopensharedobjectfile:NosuchfileordirectoryinUnknownonline0
PHPWarning: PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/gd.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/gd.so:cannotopensharedobjectfile:NosuchfileordirectoryinUnknownonline0
Warning:PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/gd.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/gd.so:cannotopensharedobjectfile:NosuchfileordirectoryinUnknownonline0
PHPWarning: PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/json.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/json.so:cannotopensharedobjectfile:NosuchfileordirectoryinUnknownonline0
Warning:PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/json.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/json.so:cannotopensharedobjectfile:NosuchfileordirectoryinUnknownonline0
PHPWarning: PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/phar.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/phar.so:cannotopensharedobjectfile:NosuchfileordirectoryinUnknownonline0
Warning:PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/phar.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/phar.so:cannotopensharedobjectfile:NosuchfileordirectoryinUnknownonline0
PHPWarning: PHPStartup:Unabletoloaddynamiclibrary'/data/boss/phpredis-develop/modules/redis.so'-/data/boss/phpredis-develop/modules/redis.so:undefinedsymbol:zend_new_interned_stringinUnknownonline0
Warning:PHPStartup:Unabletoloaddynamiclibrary'/data/boss/phpredis-develop/modules/redis.so'-/data/boss/phpredis-develop/modules/redis.so:undefinedsymbol:zend_new_interned_stringinUnknownonline0
PHPWarning: PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/zip.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/zip.so:cannotopensharedobjectfile:NosuchfileordirectoryinUnknownonline0
Warning:PHPStartup:Unabletoloaddynamiclibrary'/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/zip.so'-/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/zip.so:cannotopensharedobjectfile:NosuchfileordirectoryinUnknownonline0
protoc-php.phprequiresprotobufextensioninstalledtorun
这让我摸不着头脑了。
时间过去了好久,没有发现任何突破,却发现了一个备用的解决这个问题的方案,修改/data/php_proto/文件夹权限为0775,其他普通用户就可以直接使用了,不用加sudo(这个是我的错,忘记修改文件夹权限了,这也让我发现了这个诡异的问题)
chmod-R0775/data/php_proto
看了报的这些错误,大部分都是扩展的问题,有的是扩展加载不成功,有的是扩展不存在,我就纳闷了,为什么普通用户可以,root用户就不可以。
看到root用户php-i的时候,配置文件的地方跟非root用户有不一致的地方:
//非root
Scanthisdirforadditional.inifiles=>(none)
Additional.inifilesparsed=>(none)
//root
Scanthisdirforadditional.inifiles=>/etc/php.d
Additional.inifilesparsed=>/etc/php.d/curl.ini,
......
命名加载的是一样的配置文件怎么加载之后的内容就不一样呢?
搜了半天,知道了报的错里面有部分是跟这个有关系的,但是这个在哪里修改搜了老久也没有搜到。
忽然想到root用户和非root用户使用的php可执行文件是不一致的
root=>/usr/bin/php
非root=>/usr/local/bin/php
尝试着对这两个文件使用了php-v,结果下了我一跳,root用户的版本是5.3.3,非root用户是5.4.6,呵呵,我就呵呵了,谁部署的环境~,坑人啊。
尝试着将原有/usr/bin/php备份后,复制/usr/local/bin/php过来覆盖掉,在使用php-v发现版本一致了,也不报错了,再次去执行phpprotoc-php.php-n--psrdmp.proto,发现alliswell,至此问题解决。
纠结了半天,结果就是版本的问题。