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
相关产品推荐
相关产品推荐

