PHP 8.0 Curl请求运行正常但日志报致命错误,是什么原因?
错误产生的核心原因
出现「致命错误被记录但功能正常」的情况,大概率是以下几种场景:
- 多PHP环境冲突:XAMPP自带的PHP版本已经启用了curl扩展,你通过浏览器访问Web服务时走的是XAMPP的PHP进程,所以运行正常。但系统中还存在另一个未安装curl扩展的PHP版本(比如Ubuntu apt安装的默认PHP),被定时任务、手动CLI执行等其他入口调用时触发了报错,写入了日志。
- 存在降级兼容逻辑:PHP 8.0中
Error类可以被异常捕获,你的代码外层如果写了try {} catch (Error $e) {}逻辑,捕获到curl调用失败的错误后,自动切换到了file_get_contents、Guzzle等其他HTTP请求方式完成了接口调用,所以功能正常,但错误日志仍然被error_log配置自动记录。 - 日志为历史残留:你看到的报错是之前未安装curl扩展时产生的旧日志,后续你已经启用了curl扩展、代码正常运行,但旧日志没有被清理,导致你误认为是当前运行产生的报错。
排查解决步骤
- 首先验证XAMPP PHP的curl扩展状态,执行命令:
如果输出/opt/lampp/bin/php -m | grep curlcurl说明XAMPP环境的curl扩展正常,再执行php -m | grep curl查看系统默认PHP的curl状态,如果无输出就说明系统PHP没有curl,确认是多环境问题。 - 查看错误日志的时间戳:打开
/opt/lampp/logs/error_log,找到对应报错行的前缀时间,确认是否为近期运行产生的新日志,如果是旧日志直接清空即可,无需额外处理。 - 检查代码的异常捕获逻辑:查看
RestClient->request()方法的外层调用代码,是否存在捕获Error的逻辑,且catch分支中有备用的HTTP请求实现,如果有可以在catch中增加判断,只有非curl报错的情况再打日志,避免冗余报错。 - 排查CLI定时任务:检查系统crontab配置
crontab -l,是否有定时调用ps.scraper.php的任务,如果任务中使用的PHP路径是php而非/opt/lampp/bin/php,将路径替换为XAMPP的PHP完整路径即可解决报错。
内容的提问来源于stack exchange,提问作者Shlomi Hassid
相关产品推荐
相关产品推荐

