php cli配置文件問(wèn)題分析
引言
今天在教別人使用protobuf的時(shí)候,無(wú)意中發(fā)現(xiàn)了一個(gè)php cli模式下的詭異問(wèn)題,費(fèi)了老半天的找到解決方法了,這里拿出來(lái)分享下。
問(wèn)題描述
我們這邊最先引入了protobuf協(xié)議,使用的是allegro/php-protobuf這個(gè)擴(kuò)展安裝的。這幾天其他同事也要用到這個(gè),于是我將protobuf生成php類庫(kù)文件的部分放到了一個(gè)公共的位置/data/php_proto/文件夾下,里面有這些內(nèi)容,
drwsrwxr-x 2 yanruitao users 4096 10月 14 17:05 Dmp
-rwxrwxr-x 1 yanruitao users 472 10月 10 17:59 dmp.proto
drwsrwxr-x 2 yanruitao users 4096 10月 10 17:54 ProtobufCompiler
-rwxrwxr-x 1 yanruitao users 2969 3月 9 2015 protoc-php.php
后面兩個(gè)是必須的,生成pb協(xié)議實(shí)現(xiàn)類庫(kù)文件時(shí)會(huì)用到,前面兩個(gè)是一個(gè)簡(jiǎn)單的例子,使用也很簡(jiǎn)單,就像下面這樣。
php protoc-php.php -n --psr dmp.proto //-n是使用命名空間,--psr是使用psr-4標(biāo)準(zhǔn)等同事用的時(shí)候發(fā)現(xiàn)會(huì)報(bào)錯(cuò),
PHP Warning: file_put_contents(pb_proto_dmp.php): failed to open stream: Permission denied in /data/php_proto/ProtobufCompiler/ProtobufParser.php on line 309
同事問(wèn)我的時(shí)候我直接說(shuō),加上sudo就可以了,結(jié)果加上sudo問(wèn)題更嚴(yán)重了,本來(lái)裝好的擴(kuò)展程序加載不成功,經(jīng)過(guò)一番排查發(fā)下有下面這么一個(gè)問(wèn)題:
$yanruitao: php -i | grep 'php.ini'
$yanruitao: sudo php -i | grep 'php.ini'
兩種用戶加載的不是同一個(gè)配置文件,普通用戶加載的是/usr/local/php/lib/php.ini,而root用戶加載的是/etc/php.ini這個(gè)文件,我看了下這兩個(gè)文件內(nèi)容不一致,哈哈,好開心,趕緊把先把/etc/php.ini備份,/usr/local/php/lib/php.ini復(fù)制到/etc/php.ini,復(fù)制完了之后,我再使用的時(shí)候嚇我一跳,報(bào)了一大堆錯(cuò)誤:
PHP Warning: PHP Startup: Unable to load dynamic library '/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: undefined symbol: zend_new_interned_string in Unknown on line 0
Warning: PHP Startup: Unable to load dynamic library '/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: undefined symbol: zend_new_interned_string in Unknown on line 0
PHP Warning: PHP Startup: test: Unable to initialize module
Module compiled with module API=20100525
PHP compiled with module API=20090626
These options need to match
in Unknown on line 0
Warning: PHP Startup: test: Unable to initialize module
Module compiled with module API=20100525
PHP compiled with module API=20090626
These options need to match
in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/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: undefined symbol: zend_new_interned_string in Unknown on line 0
Warning: PHP Startup: Unable to load dynamic library '/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: undefined symbol: zend_new_interned_string in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/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: undefined symbol: zend_new_interned_string in Unknown on line 0
Warning: PHP Startup: Unable to load dynamic library '/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: undefined symbol: zend_new_interned_string in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/data/boss/phpredis-develop/modules/redis.so' - /data/boss/phpredis-develop/modules/redis.so: undefined symbol: zend_new_interned_string in Unknown on line 0
Warning: PHP Startup: Unable to load dynamic library '/data/boss/phpredis-develop/modules/redis.so' - /data/boss/phpredis-develop/modules/redis.so: undefined symbol: zend_new_interned_string in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/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: cannot open shared object file: No such file or directory in Unknown on line 0
Warning: PHP Startup: Unable to load dynamic library '/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: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/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: cannot open shared object file: No such file or directory in Unknown on line 0
Warning: PHP Startup: Unable to load dynamic library '/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: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/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: cannot open shared object file: No such file or directory in Unknown on line 0
Warning: PHP Startup: Unable to load dynamic library '/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: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/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: cannot open shared object file: No such file or directory in Unknown on line 0
Warning: PHP Startup: Unable to load dynamic library '/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: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/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: cannot open shared object file: No such file or directory in Unknown on line 0
Warning: PHP Startup: Unable to load dynamic library '/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: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/data/boss/phpredis-develop/modules/redis.so' - /data/boss/phpredis-develop/modules/redis.so: undefined symbol: zend_new_interned_string in Unknown on line 0
Warning: PHP Startup: Unable to load dynamic library '/data/boss/phpredis-develop/modules/redis.so' - /data/boss/phpredis-develop/modules/redis.so: undefined symbol: zend_new_interned_string in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/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: cannot open shared object file: No such file or directory in Unknown on line 0
Warning: PHP Startup: Unable to load dynamic library '/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: cannot open shared object file: No such file or directory in Unknown on line 0
protoc-php.php requires protobuf extension installed to run
這讓我摸不著頭腦了。
時(shí)間過(guò)去了好久,沒(méi)有發(fā)現(xiàn)任何突破,卻發(fā)現(xiàn)了一個(gè)備用的解決這個(gè)問(wèn)題的方案,修改/data/php_proto/文件夾權(quán)限為0775,其他普通用戶就可以直接使用了,不用加sudo(這個(gè)是我的錯(cuò),忘記修改文件夾權(quán)限了,這也讓我發(fā)現(xiàn)了這個(gè)詭異的問(wèn)題)
chmod -R 0775 /data/php_proto
看了報(bào)的這些錯(cuò)誤,大部分都是擴(kuò)展的問(wèn)題,有的是擴(kuò)展加載不成功,有的是擴(kuò)展不存在,我就納悶了,為什么普通用戶可以,root用戶就不可以。
看到root用戶php -i的時(shí)候,配置文件的地方跟非root用戶有不一致的地方:
//非root
Scan this dir for additional .ini files => (none)
Additional .ini files parsed => (none)
//root
Scan this dir for additional .ini files => /etc/php.d
Additional .ini files parsed => /etc/php.d/curl.ini,
......
命名加載的是一樣的配置文件怎么加載之后的內(nèi)容就不一樣呢?
搜了半天,知道了報(bào)的錯(cuò)里面有部分是跟這個(gè)有關(guān)系的,但是這個(gè)在哪里修改搜了老久也沒(méi)有搜到。
忽然想到root用戶和非root用戶使用的php可執(zhí)行文件是不一致的
root => /usr/bin/php
非root => /usr/local/bin/php
嘗試著對(duì)這兩個(gè)文件使用了php -v,結(jié)果下了我一跳,root用戶的版本是5.3.3,非root用戶是5.4.6,呵呵,我就呵呵了,誰(shuí)部署的環(huán)境~,坑人啊。
嘗試著將原有/usr/bin/php備份后,復(fù)制/usr/local/bin/php過(guò)來(lái)覆蓋掉,在使用php -v發(fā)現(xiàn)版本一致了,也不報(bào)錯(cuò)了,再次去執(zhí)行php protoc-php.php -n --psr dmp.proto,發(fā)現(xiàn)all is well,至此問(wèn)題解決。
糾結(jié)了半天,結(jié)果就是版本的問(wèn)題。
相關(guān)文章
Thinkphp 框架配置操作之配置加載與讀取配置實(shí)例分析
這篇文章主要介紹了Thinkphp 框架配置操作之配置加載與讀取配置,結(jié)合實(shí)例形式分析了Thinkphp 框架配置操作中配置加載原理、操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2020-05-05Laravel中數(shù)據(jù)遷移與數(shù)據(jù)填充的詳細(xì)步驟
這篇文章主要給大家介紹了關(guān)于Laravel中數(shù)據(jù)遷移與數(shù)據(jù)填充的相關(guān)資料,文中通過(guò)示例代碼給大家詳細(xì)介紹了實(shí)現(xiàn)的步驟,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。2017-12-12如何利用http協(xié)議發(fā)布博客園博文評(píng)論
這篇文章主要介紹了利用http協(xié)議發(fā)布博客園博文評(píng)論的方法,首先,大家要明確給博文提交評(píng)論的實(shí)質(zhì)就是通過(guò)http協(xié)議服務(wù)器發(fā)送一個(gè)post請(qǐng)求,需要的朋友可以參考下2015-08-08PHP執(zhí)行l(wèi)inux命令常用函數(shù)匯總
一般情況下,很少會(huì)用php去執(zhí)行l(wèi)inux命令,不過(guò)特殊情況下,你也許會(huì)用到這些函數(shù)。以前我知道有二個(gè)函數(shù)可以執(zhí)行l(wèi)inux命令,一個(gè)是exec,一個(gè)是shell_exec,通過(guò)本文給大家介紹PHP執(zhí)行l(wèi)inux命令常用函數(shù)匯總,需要的朋友參考下2016-02-02PHP中使用socket方式GET、POST數(shù)據(jù)實(shí)例
這篇文章主要介紹了PHP中使用socket方式GET、POST數(shù)據(jù)實(shí)例,本文分別給出GET方式和POST方式的代碼實(shí)例,需要的朋友可以參考下2015-04-04PHP實(shí)現(xiàn)AJAX動(dòng)態(tài)網(wǎng)頁(yè)及相關(guān)函數(shù)詳解
ajax其實(shí)是利用javascript向服務(wù)器請(qǐng)求數(shù)據(jù),然后局部修改頁(yè)面,下面這篇文章主要給大家介紹了關(guān)于PHP實(shí)現(xiàn)AJAX動(dòng)態(tài)網(wǎng)頁(yè)及相關(guān)函數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08php 生成靜態(tài)頁(yè)面的辦法與實(shí)現(xiàn)代碼詳細(xì)版
首先說(shuō)原理。查了那么多資料,發(fā)現(xiàn)不管用什么方法,原理都是一樣的。就是用程序讀取相應(yīng)的數(shù)據(jù)來(lái)替換模版中的變量,然后生成靜態(tài)頁(yè)。2010-02-02