首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何避免PHP中可能丢失的缓存文件?

如何避免PHP中可能丢失的缓存文件?
EN

Stack Overflow用户
提问于 2012-11-07 17:38:42
回答 2查看 234关注 0票数 0

我有一个简单的缓存系统

代码语言:javascript
运行
复制
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将process发送到第一个条件(在file_get_contents开始之前)时,可以删除该文件。

有什么办法避免这种情况吗?缓存删除系统不同吗?

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

EN

回答 2

Stack Overflow用户

发布于 2012-11-07 17:58:36

如果失败,file_get_contents将返回false,那么下面的内容如何:

代码语言:javascript
运行
复制
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可能会导致问题(取决于您的配置)。

代码语言:javascript
运行
复制
<?php
$fp = @fopen($filename, 'rb');
if ($fp === false){
  // Generate output
} else {
  fpassthru($fp);
}
票数 0
EN

Stack Overflow用户

发布于 2012-11-07 17:58:48

幸运的是,file_get_contents在出错时返回FALSE,因此您可以快速烘焙它,如:

代码语言:javascript
运行
复制
if (FALSE !== ($buffer = file_get_contents())) {
    echo $buffer;
    return;
}
// PHP process

或者类似的。考虑到您想要放置@操作符来隐藏有关不存在的文件的任何警告,这是一种快速和肮脏的方式:

代码语言:javascript
运行
复制
if (FALSE !== ($buffer = @file_get_contents())) {

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13275131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档