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 或任何其他缓存脚本

4

1 回答 1

2

Zend Optimizer+通过操作码缓存和优化来加速 PHP 的执行。它将预编译的脚本字节码存储在共享内存中。这消除了从磁盘读取代码并在将来访问时对其进行编译的阶段。为了进一步提高性能,对存储的字节码进行了优化以加快执行速度。

这是缓存包含中找到的文件内容,因此 clearstatcache 不起作用。我禁用了我的 Zend Optimizer,它现在可以工作了。

于 2012-11-06T11:11:05.400 回答