php cli配置文件问题分析
关于PHP CLI配置文件问题的与分享
引言
今天在与朋友分享protobuf使用经验时,意外发现了一个关于PHP CLI模式下的有趣问题。经过一番努力,终于找到了解决方法。在此,我想与大家分享这个经历,希望能对遇到类似问题的朋友有所帮助。
问题描述
近期,我们引入了protobuf协议,使用的是allegro/php-protobuf这个扩展。当其他同事也需要使用此协议时,我将protobuf生成php类库文件的部分设置到了一个公共的位置,即/data/php_proto/文件夹。这个文件夹包含了一些文件:
其中包括一个用于示例的文件夹Dmp和一些相关的文件,如dmp.proto(用于定义协议)和ProtobufCompiler(可能是编译协议的工具)。还有一个关键的protoc-php.php文件,它是生成pb协议实现类库文件时必不可少的。
在使用过程中,我们遇到了一个问题。PHP CLI模式下的配置文件似乎无法正确识别或加载这些文件,导致无法正常使用protobuf功能。
分析与解决
当我的同事尝试使用protoc-php.php时,遇到了一个棘手的问题。在运行命令时,系统提示需要使用命名空间和psr-4标准。在执行过程中出现了权限问题,文件无法写入。同事建议我使用sudo权限运行程序,但这反而引发了更严重的问题,已经安装好的扩展程序无法加载。
我尝试查看phpi文件的配置情况,发现普通用户和root用户加载的是不同的配置文件。普通用户加载的是/usr/local/php/lib/phpi,而root用户加载的是/etc/phpi。这两个文件的内容并不一致,我立即备份了/etc/phpi并复制了/usr/local/php/lib/phpi到该目录。在复制完成后,我遇到了更严重的错误。
PHP启动时无法加载多个动态库,包括web_stub_tl.so、protobuf.so、imagick.so等。这些库在尝试加载时都出现了类似的错误:“无法打开共享对象文件:没有这样的文件或目录”。同时还有一些库在加载时报错提示找不到某个符号,例如zend_new_interned_string。这让我完全摸不着头脑。
经过一番排查,我发现protoc-php.php需要protobuf扩展来运行。这让我意识到问题的复杂性,因为这个问题涉及到多个动态库的加载和符号问题。为了解决这个问题,我需要深入研究PHP的配置和这些动态库的兼容性。这可能涉及到查看PHP版本和这些库的版本是否匹配,以及确保所有依赖的库都已经正确安装和配置。
这是一个涉及多个方面的问题,包括权限、配置文件、动态库加载和符号问题等。为了解决这些问题,我需要仔细研究PHP的配置和这些库的兼容性,并确保所有依赖的库都已经正确安装和配置。希望通过不断的努力,能够找到解决问题的方法,让protoc-php.php正常运行。
当我仔细审查之前的错误报告时,发现大多与扩展有关。有时扩展加载失败,有时则根本不存在。我对此感到困惑不解,为何普通用户可以顺利运行,而root用户却频频受阻。在深入研究时,我注意到root用户和非root用户在运行php -i时,配置文件的加载路径存在差异。
在非root用户的界面中,扫描附加的i文件目录和附加的i文件均显示为(无)。而在root用户的界面中,扫描和的目录指向了/etc/php.d,并且列出了如curli等多个附加的i文件。这引发了我的好奇,同样加载的配置文件,为何内容却有所不同?
经过长时间的搜索,我终于意识到问题的根源在于root用户和非root用户使用的php可执行文件并不相同。具体来说,root用户使用的是/usr/bin/php,而非root用户则使用的是/usr/local/bin/php。这两个路径下的php版本存在显著的差异,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时,一切正常,问题得到了圆满的解决。
回顾整个解决问题的过程,让我深感纠结的问题竟然源于版本差异。这也提醒我在未来的工作中要更加细心谨慎,避免类似的疏忽再次发生。现在,我可以安心地继续我的工作,不再被这个问题所困扰。
编程语言
- php cli配置文件问题分析
- JavaScript中发出HTTP请求最常用的方法
- JSP自定义分页标签TAG全过程
- bs架构和cs架构的区别_动力节点Java学院整理
- 详解Mysql5.7自带的压力测试命令mysqlslap及使用语法
- jQuery实现在列表的首行添加数据
- PHPStudy下如何为Apache安装SSL证书的方法步骤
- jQuery实现可兼容IE6的遮罩功能详解
- 高性能JavaScript模板引擎实现原理详解
- 详解Vue2.0配置mint-ui踩过的那些坑
- 适用于抽奖程序、随机广告的PHP概率算法实例
- SQL Server安装完成后3个需要立即修改的配置选项
- javascript结合CSS实现苹果开关按钮特效
- jQuery可见性过滤选择器用法示例
- PHP基于XMLWriter操作xml的方法分析
- PHP连接sql server 2005环境配置及问题解决