0

我有一个简单的缓存系统

if (file_exists($cache)) {
echo file_get_contents($cache);
// if coming here when $cache is deleting, then nothing to display
}
else {
// PHP process
}

我们会定期删除过期的缓存文件,例如 1 小时后删除所有缓存。虽然这个过程非常快,但我认为可以在if statementfile_get_contents进程之间删除缓存文件。

if statement的意思是当检查缓存文件是否存在时,它存在;但是当file_get_contents试图捕捉它时,它不再存在(通过同时缓存删除过程删除)。

file_get_contents锁定文件以避免在读取过程中进行删除过程。if statement但是当将 PHP 进程发送到第一个条件(在 开始之前)时,可以删除该文件file_get_contents

有什么方法可以避免这种情况吗?缓存删除系统是否不同?

注意:我没有遇到任何实际问题,因为捕获此事件的可能性不大,但从逻辑上讲这是可能的,并且应该在重负载时发生。

4

2 回答 2

0

失败时,file_get_contents返回 false,那么这个呢:

if (($output = file_get_contents($filename)) === false){
  // Do the processing.
  $output = 'Generated content';
  // Save cache file
  file_put_contents($filename, $output);
}
echo $output;

顺便说一句,您可能需要考虑使用fpassthru,它更节省内存,尤其是对于较大的文件。在大文件(> 100 MB)上使用 file_get_contents 可能会导致问题(取决于您的配置)。

<?php
$fp = @fopen($filename, 'rb');
if ($fp === false){
  // Generate output
} else {
  fpassthru($fp);
}
于 2012-11-07T17:58:36.900 回答
0

幸运的是file_get_contents返回FALSE错误,所以你可以快速烘焙它:

if (FALSE !== ($buffer = file_get_contents())) {
    echo $buffer;
    return;
}
// PHP process

或类似的。@考虑到您希望操作员隐藏有关不存在文件的任何警告,这有点快速和肮脏的方式:

if (FALSE !== ($buffer = @file_get_contents())) {

另一种选择是锁定,但是如果您已锁定文件,这可能会阻止您的缓存删除删除文件。

然后剩下的是你自己的缓存。这意味着在 PHP 中读取文件创建时间,检查它是否小于 5 分钟,然后进行文件删除处理(5 分钟是示例性的),然后您就会知道该文件已经过时并被替换为新内容。然后重新创建文件。否则读入文件,这可能比使用readfile而不是file_get_contents和更好echo

于 2012-11-07T17:58:48.713 回答