PHP包含路径顺序和状态缓存

6
我正在构建一个框架,其中产品实例使用主要的框架文件,直到有自己版本的该文件的副本。为实现这一点,我已经完成了以下操作:
set_include_path(MY_PRODUCT_ROOT.'/' . PATH_SEPARATOR . MY_FRAMEWORK_ROOT.'/');

所以,如果我调用include('view-users.php');,它将首先在MY_PRODUCT_ROOT中查找/view-users.php,如果没有找到,然后它将查找MY_FRAMEWORK_ROOT/view-users.php。
这个过程一直很好,直到我向产品根目录添加文件。我知道PHP / Apache正在缓存包含文件,并且人们可能认为要运行clearstatcache(true);清除任何状态缓存。 PHP可能在其include();内部使用了file_exists,并认为新文件仍不存在。我尝试重新启动Apache,但没有效果。
不幸的是,运行clearstatcache(true);也没有帮助。只有在删除MY_FRAMEWORK_ROOT / file后,它才会想到清除缓存并重试,从而找到MY_PRODUCT_ROOT / file。
我有点困惑,我知道我们需要刷新PHP / Apache对文件是否存在的理解,但clearstatcache(true);没有帮助......
有什么想法吗?
更新:更正,现在重新启动Apache似乎有帮助。我重申,这仅在尝试向MY_PRODUCT_ROOT添加文件以覆盖现有的MY_FRAMEWORK_ROOT文件进行自定义时发生。
更新:开发环境是Windows上的Zend Server CE PHP 5.3.14,生产环境是Centos Linux httpd,PHP 5.3+。我的开发环境启用了Zend优化器,这可能会产生影响,同时不使用APC或任何其他缓存脚本。

更准确地说,仅在调用clearstatcache时重新启动apache才有效。实际上,我必须删除框架文件,然后重新加载页面,并将框架文件放回。 - Prof
1
你是否启用了APC缓存?(或其他opcode缓存) - Niko Sams
我在php-5.3.3和apache 2.2.16上也无法重现您的问题。您能否提供更多关于您的环境的信息? - Lars
@NikoSams 没有使用APC缓存。 - Prof
@Lars,我正在使用ZendServer PHP 5.3.14(开发环境),将在运行Centos服务器PHP 5.3+。现在看到php信息,可能与Zend Optimizer有关...我会查一下。 - Prof
@NikoSams 你关于操作码缓存的说法是正确的,我只是没有意识到我的 Zend 优化器已经开启了 :p - Prof
1个回答

2
Zend Optimizer+通过使用opcode缓存和优化来加速PHP执行。它将预编译的脚本字节码存储在共享内存中,这消除了从磁盘读取代码并在未来访问时编译它的阶段。为了进一步提高性能,存储的字节码被优化以实现更快的执行。
这会缓存包含文件中找到的文件内容,因此clearstatcache不起作用。我已经禁用了我的Zend Optimizer,现在它可以正常工作。

1
请注意,您可以接受自己的答案。此外,请检查一下当Zend Optimizer+处于活动状态时,clearstatcache(true, true)是否有所不同?如果没有,您应该在产品主页上提交错误报告。 - Lars

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接