php cli配置文件问题分析


Posted in PHP onOctober 15, 2015

引言

今天在教别人使用protobuf的时候,无意中发现了一个php cli模式下的诡异问题,费了老半天的找到解决方法了,这里拿出来分享下。

问题描述

我们这边最先引入了protobuf协议,使用的是allegro/php-protobuf这个扩展安装的。这几天其他同事也要用到这个,于是我将protobuf生成php类库文件的部分放到了一个公共的位置/data/php_proto/文件夹下,里面有这些内容,

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

后面两个是必须的,生成pb协议实现类库文件时会用到,前面两个是一个简单的例子,使用也很简单,就像下面这样。

php protoc-php.php -n --psr dmp.proto //-n是使用命名空间,--psr是使用psr-4标准等同事用的时候发现会报错,

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

同事问我的时候我直接说,加上sudo就可以了,结果加上sudo问题更严重了,本来装好的扩展程序加载不成功,经过一番排查发下有下面这么一个问题:

$yanruitao: php -i | grep 'php.ini'
$yanruitao: sudo php -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,复制完了之后,我再使用的时候吓我一跳,报了一大堆错误:

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

这让我摸不着头脑了。

时间过去了好久,没有发现任何突破,却发现了一个备用的解决这个问题的方案,修改/data/php_proto/文件夹权限为0775,其他普通用户就可以直接使用了,不用加sudo(这个是我的错,忘记修改文件夹权限了,这也让我发现了这个诡异的问题)

chmod -R 0775 /data/php_proto
看了报的这些错误,大部分都是扩展的问题,有的是扩展加载不成功,有的是扩展不存在,我就纳闷了,为什么普通用户可以,root用户就不可以。

看到root用户php -i的时候,配置文件的地方跟非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,


......
命名加载的是一样的配置文件怎么加载之后的内容就不一样呢?
搜了半天,知道了报的错里面有部分是跟这个有关系的,但是这个在哪里修改搜了老久也没有搜到。

忽然想到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发现版本一致了,也不报错了,再次去执行php protoc-php.php -n --psr dmp.proto,发现all is well,至此问题解决。

纠结了半天,结果就是版本的问题。

PHP 相关文章推荐
php数组应用之比较两个时间的相减排序
Aug 18 PHP
phpcms模块开发之swfupload的使用介绍
Apr 28 PHP
PHP使用glob函数遍历目录或文件夹的方法
Dec 16 PHP
64位windows系统下安装Memcache缓存
Dec 06 PHP
详谈PHP程序Laravel 5框架的优化技巧
Jul 18 PHP
如何判断php mysqli扩展类是否开启
Dec 24 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
Aug 01 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
PHP使用pdo实现事务处理操作示例
Sep 05 PHP
PHP封装的mysqli数据库操作类示例
Feb 16 PHP
详解提高使用Java反射的效率方法
Apr 29 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
Oct 30 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
Oct 15 #PHP
10个php函数实用却不常见
Oct 13 #PHP
PHP实现连接设备、通讯和发送命令的方法
Oct 13 #PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
Oct 13 #PHP
JavaScript与HTML结合的基本使用方法整理
Oct 12 #PHP
apache和PHP如何整合在一起
Oct 12 #PHP
php实现Mysql简易操作类
Oct 11 #PHP
You might like
用PHP和ACCESS写聊天室(七)
2006/10/09 PHP
Admin generator, filters and I18n
2011/10/06 PHP
深入PHP异步执行的详解
2013/06/03 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
PHP批量修改文件名称的方法分析
2017/02/27 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
用javascript编写的第一人称射击游戏
2007/02/25 Javascript
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
jQuery 使用手册(五)
2009/09/23 Javascript
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
js 函数的副作用分析
2011/08/23 Javascript
jQuery设置和获取HTML、文本和值示例
2014/07/08 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
2015/06/01 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
JavaScript在控件上添加倒计时功能的实现代码
2017/07/04 Javascript
jquery获取img的src值实例介绍
2019/01/16 jQuery
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
2019/03/15 Javascript
vue+高德地图实现地图搜索及点击定位操作
2020/09/09 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
跟老齐学Python之字典,你还记得吗?
2014/09/20 Python
Python 访问限制 private public的详细介绍
2018/10/16 Python
Python Series从0开始索引的方法
2018/11/06 Python
用Python解决x的n次方问题
2019/02/08 Python
浅谈python标准库--functools.partial
2019/03/13 Python
python判断无向图环是否存在的示例
2019/11/22 Python
matlab灰度图像调整及imadjust函数的用法详解
2020/02/27 Python
Python3操作读写CSV文件使用包过程解析
2020/04/10 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
Python实现敏感词过滤的4种方法
2020/09/12 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
最新的小工具和卓越的产品设计:Oh That Tech!
2019/08/07 全球购物
财务工作犯错检讨书
2014/10/07 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书
python playwright之元素定位示例详解
2022/07/23 Python