PHP 7兼容性排查求助:代码无检测报错但切换环境后失效
兄弟,我太懂这种兼容性工具没报错但实际跑不起来的憋屈了!很多时候工具只能帮你扫语法层面的问题,但PHP 5.6到7的变化里,有不少「隐性坑」是工具检测不到的,我帮你列几个最可能的方向,你逐一排查下:
错误报告被隐藏,根本看不到问题在哪
PHP 7的默认错误显示设置可能和5.6不一样,或者你的代码里有error_reporting(0)、ini_set('display_errors', 0)这类语句,把致命错误给屏蔽了,导致看起来只是返回空内容。
先在代码最开头加上这两行,强制显示所有错误:error_reporting(E_ALL); ini_set('display_errors', 1);或者直接去服务器的PHP错误日志里找记录——日志里肯定藏着真相。
依赖的扩展没在PHP 7里安装
兼容性工具不会检测你代码依赖的PHP扩展是否存在。比如PHP 7里默认不再包含mcrypt、老版mysql_*函数依赖的扩展这类组件,如果你的代码里用到了,迁移后没装对应的扩展,会直接触发致命错误导致脚本终止。
你可以用phpinfo()输出当前PHP的扩展列表,对比PHP 5.6环境下的扩展,看看少了哪些。PHP 7的错误类型升级:警告变致命错误
PHP 7把很多之前的警告、通知级别的错误升级成了可捕获的Throwable异常(比如DivisionByZeroError、TypeError),如果你的代码里没有处理这些异常,脚本会直接崩溃。
举个例子:PHP 5.6里echo $undefinedVar;只会报个通知,脚本继续跑;但如果你的代码里开启了declare(strict_types=1);严格类型模式,或者有函数参数类型声明不匹配的情况,PHP 7会直接抛出TypeError终止脚本。变量/数组的隐性行为变化
比如PHP 7里foreach遍历数组时,对数组的修改行为和5.6有细微差别;还有一个容易忽略的点:PHP 7彻底移除了magic_quotes_gpc特性,如果你的代码之前依赖这个自动转义的功能,现在直接用$_POST/$_GET的内容拼接SQL或输出,可能会触发语法错误导致脚本终止。废弃/移除函数的隐性调用
有些函数PHP 7里被完全移除(比如ereg_*系列),调用就会触发致命错误。虽然兼容性工具一般能查到,但也不排除工具漏检的情况,你可以搜下代码里有没有这类老版本的函数。
先从开启错误报告看日志开始吧,90%的情况都能直接找到问题!
内容的提问来源于stack exchange,提问作者Chris J.

