我们使用APC作为操作码缓存。有没有办法让APC缓存不存在的文件?我们设置了apc.stat = 0
和apc.include_once_override = 1
。还有一些事情要做,以提高在文件系统上可能不存在的文件上调用include_once
的性能吗?如果它存在,显然我们想要包括它。但是,如果它不存在,它永远不会存在,我们不希望PHP在每个请求检查的文件上调用open()
。
对于某些背景:我们有一个基本站点,但是逐个客户地为站点提供自定义。有些客户有自定义登录页面,有些客户有完全独特的页面等。
我们以稍微不同寻常的方式使用Zend Framework,允许我们根据需要覆盖控制器。我们的站点可能有一个名为LoginController
的控制器,在文件controllers/LoginController.php
中定义。但是,我们的客户“公司”可能需要自定义登录页面,因此我们将编写在目录Company_LoginController
中定义的名为controllers/company/LoginController.php
的新类。 (这种命名约定使我们能够与Zend Framework的“模块”概念保持一致。)
当我们处理课程时,我们基本上会做这样的事情:
include_once APPLICATION_PATH . '/controllers/company/LoginController.php';
if (class_exists("Company_LoginController")) {
echo 'customer-specific controller exists';
} else {
include_once APPLICATION_PATH . '/controllers/LoginController.php';
echo 'customer-specific controller does not exist; using default';
}
如果文件/controllers/company/LoginController.php
存在,APC将在第一个请求上缓存它,并且永远不会再从文件系统中获取它。但是,如果文件/controllers/company/LoginController.php
不存在,我不希望APC多次检查此文件是否存在。有没有办法实现这一目标?
答案 0 :(得分:3)
您可以在公司目录中创建空文件吗?由于APC不会加载它们两次,因此在服务器第一次启动时会有一些空文件被“加载”没有坏处。
答案 1 :(得分:2)
jmucchiello的答案得到了我对简单的投票,但如果出于某种原因这是不切实际的,你总是可以用艰难的方式做事。
以下是一个粗略的,未经测试的示例,但它应该传达基本的想法,即自己手动存储文件在APC中的存在
function conditional_include($file) {
$key = 'file-exists-' . $file;
//fetch cache key; if it does not exist, then...
if(($fileExists = apc_fetch($key)) === false) {
//actually hit the disk to look for the file, and store the result
apc_store($key, $fileExists = (file_exists($file) ? 1 : 0));
}
//only include the file if it exists.
if($fileExists)
include_once $file;
}
答案 2 :(得分:0)
如果您使用的是Zend Framework,我建议您使用Zend_Loader自动加载魔法来确保加载您需要的文件。 通过使用自动加载器,您可以从ZF中删除几乎所有的include_once调用(Zend_Loader类中的调用除外) 警告 - 取决于你的类和文件样式,但你可以重写/扩展自动加载器来对付它。
这可能不是你想要的,但我希望它有用..