PHP IIS环境执行特定远程MySQL查询偶发500.0错误排查求助
排查步骤
- 首先修复错误捕获逻辑,当前代码主动屏蔽了错误输出,是找不到问题的核心原因:
- 修改机器B的
php.ini配置:开启log_errors = On,指定error_log为一个IIS进程有写入权限的本地路径,关闭display_errors避免错误输出到前端 - 移除
pdoconnection.php中error_reporting(E_ALL ^ E_WARNING)的错误屏蔽逻辑,将PDO的错误模式从PDO::ERRMODE_WARNING改为PDO::ERRMODE_EXCEPTION,连接失败的catch分支不要直接吞异常,将异常信息写入错误日志后再退出 - 业务代码执行数据库操作前先判断
$MYPDO是否为null,避免空对象调用方法触发PHP致命错误;不要使用or die()的写法,改为用try-catch包裹所有PDO操作,捕获到异常后完整写入日志
- 修改机器B的
- 验证PDO持久连接是否为故障诱因:当前开启了
PDO::ATTR_PERSISTENT = true,PHP 7.3和PHP 5.6的FastCGI持久连接复用逻辑存在差异,跨机器的TCP连接偶发被防火墙/MySQL主动断开后,PHP 7.3的进程池可能会缓存失效连接,下次调用时直接触发错误。可以先将ATTR_PERSISTENT改为false测试,如果故障消失即可定位是持久连接的问题,后续可以调整MySQL的wait_timeout参数或者添加连接存活校验逻辑解决 - 排查网络层面的偶发故障:在机器B上长时间运行MySQL连通性测试脚本,循环执行远程连接、简单查询操作,统计是否存在连接超时、丢包的情况,确认两台机器之间的防火墙、安全组没有限制高频连接,也没有TCP空闲断连的策略
内容的提问来源于stack exchange,提问作者MirrorMirror
相关产品推荐
相关产品推荐

