3

我们使用 APC 作为操作码缓存。有没有办法让 APC 缓存不存在的文件?我们设置了apc.stat = 0apc.include_once_override = 1include_once为了提高调用文件系统上可能不存在的文件的性能,是否还有更多工作要做?如果它存在,显然我们想要包含它。但是,如果它不存在,它将永远不存在,我们不希望 PHPopen()在每个请求中调用该文件进行检查。

对于某些背景:我们有一个基础站点,但会为每个客户提供对站点的定制。有些客户有自定义登录页面,有些客户有完全独特的页面,等等。

我们以一种稍微不寻常的方式使用 Zend 框架,以允许我们根据需要覆盖控制器。我们的站点可能有一个名为 的控制器LoginController,定义在一个文件中controllers/LoginController.php。但是,我们的客户“公司”可能需要自定义登录页面,因此我们将编写一个名为Company_LoginControllerdefined in a directory的新类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 多次检查该文件是否存在。有什么办法可以做到这一点?

4

3 回答 3

3

您可以在公司目录中创建空文件吗?由于 APC 不会加载它们两次,因此在服务器第一次启动时让一些空文件被“加载”并没有什么害处。

于 2009-05-12T21:14:09.403 回答
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;
}
于 2009-05-12T21:36:03.253 回答
0

如果您使用 Zend Framework,我建议您使用 Zend_Loader 自动加载魔法来确保加载您需要的文件。通过使用自动加载器,您可以从 ZF 中删除几乎所有的 include_once 调用(除了 Zend_Loader 类中的调用)警告 - 确实取决于您的类和文件命名样式,但您可以重写/扩展自动加载器来解决这个问题。

这可能不是您所追求的,但我希望它对您有所帮助..

于 2010-05-08T18:46:49.693 回答