PHP if条件不满足时块内$logger->add_log仍被执行故障排查
异常触发原因分析
- OPcache缓存未更新导致实际运行代码与编辑代码不一致
这是最高概率的触发原因:如果你的服务器开启了OPcache优化,修改代码后未清空缓存的情况下,PHP-fpm实际运行的还是旧版本代码。如果旧版本中$logger->add_log($ip_address)逻辑写在if判断块外部,就会出现无论if条件是否成立都会写入日志、if条件不成立时不输出json也不执行die()的现象。
排查方式:重启php-fpm服务清空缓存,或者在代码头部临时添加opcache_reset();验证是否恢复正常。 - 跨域预检请求重复触发逻辑
你的代码中放开了OPTIONS请求的跨域权限,浏览器发送跨域POST请求前会先自动发送一次不带请求体的OPTIONS预检请求:
此时请求没有hash参数,$hash为null,strlen($hash)返回值为0,满足$urlLength < 23的条件,会执行日志写入、输出json、终止请求。后续实际POST请求携带的hash长度≥23,不会进入if块,也不会写日志。你观测到的日志实际是预检请求写入的,会被误判为POST请求不满足if条件时也执行了日志写入。
排查方式:在日志中新增请求方法字段区分请求类型,或者在代码开头增加预检请求判断:if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') exit(http_response_code(200)); - JSON解析失败导致判断逻辑误差
如果请求body不是合法JSON格式,json_decode会返回null,此时$_POST['hash']取值为null,strlen(null)返回值为0,会进入if块写入日志。如果你测试时误传了非法格式的请求参数,也会出现看起来条件不满足但写入了日志的现象。
排查方式:在if判断前增加参数校验逻辑,先判断isset($_POST['hash']),不满足直接返回参数错误。 - 外部依赖文件调用日志方法
检查你省略的//... some require statements引入的文件中,有没有实例化logger类并调用add_log的逻辑,外部的日志调用和当前if块无关,也会产生你观测到的日志记录。
内容的提问来源于stack exchange,提问作者1000 iq
相关产品推荐
相关产品推荐

