我在 Centos 6.4 上使用 PHP 版本 5.4.20。
在 var/www/html/oldDirecory/index.php
中,我开始使用 syslog(LOG_INFO,__FILE__);
。
使用 PHP,我使用以下方法重命名目录:
rename(dirname(__FILE__).'/oldDirectory', dirname(__FILE__).'/newDirectory');
我的脚本然后使用 JS 重定向到使用 window.location
的新 URL。下次服务器被命中时,syslog(LOG_INFO,__FILE__);
仍然显示旧目录!
使用 Bash 命令行,我看到目录名称已更改。
我使用 vi
编辑文件,不做任何更改,然后保存它,然后 __FILE__
显示正确的目录。
我尝试制作一个简单的脚本(没有 JS 重定向、多个 includes()
等),但似乎无法复制该行为。我认为这在早期的 PHP 版本中不会发生,但这可能是我添加的其他内容。也许与缓存有关?抱歉缺少信息,但我很困惑!
最佳答案
您是否使用像 APC 这样的操作码缓存?如果是这样,请在重命名包含目录后触摸
受影响的文件。它在解析时进行评估,但操作码缓存存储解析结果。
我成功地用 APC 复制了你的问题。据推测,文件名和 inode 编号匹配且没有修改时间更改使其命中缓存。使用 touch 更改修改时间应该可以解决问题。
关于PHP常量__FILE__与URL中的不一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20456281/