APC中的操作码缓存和丢失的文件

时间:2009-05-12 20:27:47

标签: php apc

我们使用APC作为操作码缓存。有没有办法让APC缓存不存在的文件?我们设置了apc.stat = 0apc.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多次检查此文件是否存在。有没有办法实现这一目标?

3 个答案:

答案 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类中的调用除外) 警告 - 取决于你的类和文件样式,但你可以重写/扩展自动加载器来对付它。

这可能不是你想要的,但我希望它有用..