You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 7中已重命名文件仍被引用报错的原因排查

问题描述

我在PHP 7环境下遇到以下致命错误:

<b>Fatal error</b>:  Uncaught ErrorException: Undefined variable: throw_count in C:\inetpub\***\templates\left_nav.php:42
Stack trace:
#0 C:\inetpub\***\templates\left_nav.php(42): {closure}(8, 'Undefined varia...', 'C:\\inetpub\\***...', 42, Array)
#1 C:\inetpub\***\templates\page_header.php(18): require('C:\\inetpub\\***...')
#2 C:\inetpub\***\catalog\product_list.php(232): include('C:\\inetpub\\***...')
#3 C:\inetpub\***\catalog\index.php(13): include('C:\\inetpub\\***...')
#4 {main}
  thrown in <b>C:\inetpub\***\templates\left_nav.php</b> on line <b>42</b><br />

但实际情况与报错不符:

  • 已将C:\inetpub\***\templates\left_nav.php重命名为bad_left_nav.php,原文件不存在
  • 即便原文件存在,其第42行代码为$stmt->execute($params);,且脚本中已删除所有$throw_count变量的引用

同时确认引用路径无问题:

  • page_header.php第18行代码:require(APP_DIR . '/templates/left_nav.php');
  • APP_DIR在C:\inetpub\***\catalog\product_list.php中定义:define('APP_DIR', dirname(__DIR__));

已禁用Opcache,请问PHP仍引用旧版本文件的原因是什么?

可能的原因及解决方案
  • Windows文件锁定:Windows系统中,Web服务器进程(如IIS)可能占用了原文件句柄,导致重命名操作未真正生效,进程仍读取旧文件。解决:重启IIS或对应Web服务器进程,释放文件锁定。
  • PHP realpath缓存:即便禁用Opcache,PHP的realpath缓存仍可能保留旧文件路径记录。解决:在入口脚本开头添加clearstatcache(true);强制清除缓存,或修改php.ini中realpath_cache_size = 0后重启PHP服务。
  • 路径大小写问题:Windows大小写不敏感,但如果代码中引用路径与实际文件路径大小写不一致,可能触发缓存路径匹配错误。解决:检查所有引用中left_nav.php的大小写,确保与文件系统完全一致。
  • 临时/备份文件干扰:目录中若存在left_nav.php~等临时文件、备份文件,或版本控制生成的衍生文件,PHP可能误加载。解决:清理目录下无关文件,仅保留重命名后的bad_left_nav.php。
  • Web服务器缓存:部分Web服务器(如IIS)会缓存脚本文件,即使文件已修改或重命名。解决:清空Web服务器缓存,或重启服务器。

内容的提问来源于stack exchange,提问作者radar33

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:48:11