php版本问题是一个很容易遗忘的问题,当我用git版本确信开发环境和生产环境程序没有任何区别,但线上环境却不出结果的时候,就应该想到是php版本的问题了。
php不同的版本4.x,5.1.x,5.2.x,5.3.x对特定的类和方法支持是不同,更可恶的如果是编译的php环境,后期业务开发需要的php扩展没有事先编译安装导致的功能失效。线上的生产环境是没办法直接调试的哦~
正如,我在用支付宝的第三方担保到帐支付接口时遇到的:
确认发货接口:确认发货后支付宝给出xml文档response,开发环境php版本为5.3.3,正常解析。
生产环境php版本为5.1.6,且为编译安装。
php 4.x之前是绑定domxml扩展的,该扩展不具备良好的面向对象规范,于是在php 5.0.0版本后被移出到pecl扩展库中,不再被php5内建支持。php 5.x采用新的dom扩展,详见php手册。
而编译安装的php就要看具体的编译配置了。
通过phpinfo()可以看到php是否真正的支持特定扩展,如果phpinfo()在php.ini中被禁止访问的话,可以采用php -i|grep 扩展名来查看,不过最可靠的方法是用class_exists(‘扩展名’)来检测。如果没有的话就要从新安装php扩展,yum或apt-get安装的php环境可以使用命令进行网络安装;如果php环境是编译安装的话,那么用phpize这个神器来安装php扩展吧。
=======================
我错了,dom在php5中是被内建支持的,并且没有pecl的dom扩展包,只有domxml,这个包我们刚才说过是php4.x时代的类库,不支持面向对象的。
现在的php环境找不到DOMDocument类,只可能是当时编译php的时候xml的扩展没有成功加载,程序中用到dom的类,只能报错,找不到DOMDocument类。
实在没办法了,我湿了下:
#yum install php-xml
靠,居然在当前的php版本上平滑升级了,php-xml扩展问题完美修复。
太纠结了,这个结果,我还是有点不明白。。。
慢慢理解吧===
注:php针对xml文档的操作有三种扩展可选,SimpleXML用来处理简单的xml文档,Dom扩展用来处理复杂的xml,这两种都是xml文档的树状解析方法(就是按照xml文档结构,将文档节点转换为结构化数组,一次性全部存入内容中),xmlreader扩展用来处理大型xml文档,采用流式解析方法(按照节点遍历的方法,将当前节点存入内存中进行实时处理)。
另外,php处理xml的方法还应该关注一下xslt和xpath。
未完,待续。。。