php cli配置文件问题分析_PHP
引言
今天在教别人使用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
警告:PHP启动:无法加载动态库 '/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:无法打开共享对象文件:第 0 行“未知”中没有此类文件或目录
PHP 警告:PHP 启动:无法加载动态库 '/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:无法打开共享对象文件:第 0 行“未知”中没有此类文件或目录
警告:PHP启动:无法加载动态库 '/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: 无法打开共享对象文件: 第 0 行的未知中没有这样的文件或目录
PHP 警告:PHP 启动:无法加载动态库 '/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:无法打开共享对象文件:第 0 行“未知”中没有此类文件或目录
警告:PHP启动:无法加载动态库 '/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:无法打开共享对象文件:第 0 行“未知”中没有此类文件或目录
PHP 警告:PHP 启动:无法加载动态库 '/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:无法打开共享对象文件:第 0 行“未知”中没有此类文件或目录
警告:PHP启动:无法加载动态库 '/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:无法打开共享对象文件:第 0 行“未知”中没有此类文件或目录
PHP 警告:PHP 启动:无法加载动态库 '/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:无法打开共享对象文件:第 0 行“未知”中没有此类文件或目录
警告:PHP启动:无法加载动态库 '/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:无法打开共享对象文件:第 0 行“未知”中没有此类文件或目录
PHP 警告:PHP 启动:无法加载动态库 '/data/boss/phpredis-develop/modules/redis.so' - /data/boss/phpredis-develop/modules/redis.so:未定义符号:未知中的 zend_new_interned_string第 0 行
警告:PHP启动:无法加载动态库'/data/boss/phpredis-develop/modules/redis.so' - /data/boss/phpredis-develop/modules/redis.so:未定义符号:zend_new_interned_string in第 0 行未知
PHP 警告:PHP 启动:无法加载动态库 '/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:无法打开共享对象文件:第 0 行“未知”中没有此类文件或目录
警告:PHP 启动:无法加载动态库 '/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:无法打开共享对象文件:第 0 行“未知”中没有此类文件或目录
protoc-php.php 需要安装 protobuf 扩展才能运行
这让我摸不着头脑了。
时间过去了好久,没有发现任何突破,却发现了一个备用的解决这个问题的方案,修改/data/php_proto/文件夹权限为0775,其他普通用户就可以直接使用了,不用加sudo(这个是我的错,忘记修改文件夹权限了,这也让我发现了这个诡异的问题)
chmod -R 0775 /data/php_proto
看了报的这些错误,大部分都是扩展的问题,有的扩展加载不成功,有的扩展不存在,我就纳闷了,为什么普通用户可以,root用户不行。
看到root用户php -i的时候,配置文件的位置与非root用户有不一致的位置:
//非root
扫描此目录以获取其他 .ini 文件 => (无)
解析的其他 .ini 文件=> (无)
//根
扫描此目录以获取其他 .ini 文件 => /etc/php.d
解析的其他 .ini 文件 => /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,至此问题解决。
纠结了半天,结果就是版本的问题。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。
