php删除文件后重建,文件创建时间(filectime)未变化怎么解决??
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php删除文件后重建,文件创建时间(filectime)未变化怎么解决??,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4322字,纯文字阅读大概需要7分钟。
内容图文
![php删除文件后重建,文件创建时间(filectime)未变化怎么解决??](/upload/InfoBanner/zyjiaocheng/151/9a68ce1da11946c0b8bc73d260916ab9.jpg)
php 创建文件名为 test.html 的文件,使用 filectime 获取创建时间 t1
php 删除文件名为 test.html 的文件
php 重新创建文件名为 test.html 的文件,使用 filectime 获取创建时间 t2
为什么 t1 = t2 ?? 就是创建时间为什么没更新?? 我使用了 clearstatcache 函数清除文件状态缓存也没点用,这个怎么解决??(由于在判断是否重新生成缓存文件的时候,需要知道缓存文件的创建时间,所以很重要..,求解决~)
下面是出现这种情况的问题的代码(有点密,请耐心看下哈):
// 页面缓存
if ((defined('DEBUG_MODE') && !DEBUG_MODE) && (defined('CACHE_CONTROL') && CACHE_CONTROL)) {
$opr = $GLOBALS['module'] . '/' . $GLOBALS['platform'] . '/' . $GLOBALS['controller'] . '/' . $GLOBALS['act'];
$cache_name = md5($opr) . TEMPLATE_SUFFIX;
$cache_file = APP_DIR . '/' . $GLOBALS['module'] . '/' . $GLOBALS['platform'] . '/Cache/' . $cache_name;
// 清除文件状态缓存(就我使用的情况来看,压根没毛用...,这什么情况??)
clearstatcache();
// 缓存文件不存在 创建
if (!$GLOBALS['FOpr']->checkFile($cache_file)) {
require_once $view_file;
$GLOBALS['FOpr']->cFile($cache_file);
$GLOBALS['FOpr']->wData($cache_file , ob_get_contents());
} else {
// 超时重新缓存
if (time() > filectime($cache_file) + CACHE_LIFE_TIME) {
require_once $view_file;
// 缓存文件超时时,先删除原缓存文件
$GLOBALS['FOpr']->dFile($cache_file);
// 新建同名缓存文件
//(新建文件时,filectime 获取文件创建时间一直没更新!这个怎么破??
// 这导致我没法重新生成缓存文件了!)
$GLOBALS['FOpr']->cFile($cache_file);
// 写入缓存
$GLOBALS['FOpr']->wData($cache_file , ob_get_contents() , 'w');
} else {
// 加载缓存文件
require_once $cache_file;
}
}
} else {
// 显示动态文件(非缓存)
require_once $view_file;
}
回复内容:
php 创建文件名为 test.html 的文件,使用 filectime 获取创建时间 t1
php 删除文件名为 test.html 的文件
php 重新创建文件名为 test.html 的文件,使用 filectime 获取创建时间 t2
为什么 t1 = t2 ?? 就是创建时间为什么没更新?? 我使用了 clearstatcache 函数清除文件状态缓存也没点用,这个怎么解决??(由于在判断是否重新生成缓存文件的时候,需要知道缓存文件的创建时间,所以很重要..,求解决~)
下面是出现这种情况的问题的代码(有点密,请耐心看下哈):
// 页面缓存
if ((defined('DEBUG_MODE') && !DEBUG_MODE) && (defined('CACHE_CONTROL') && CACHE_CONTROL)) {
$opr = $GLOBALS['module'] . '/' . $GLOBALS['platform'] . '/' . $GLOBALS['controller'] . '/' . $GLOBALS['act'];
$cache_name = md5($opr) . TEMPLATE_SUFFIX;
$cache_file = APP_DIR . '/' . $GLOBALS['module'] . '/' . $GLOBALS['platform'] . '/Cache/' . $cache_name;
// 清除文件状态缓存(就我使用的情况来看,压根没毛用...,这什么情况??)
clearstatcache();
// 缓存文件不存在 创建
if (!$GLOBALS['FOpr']->checkFile($cache_file)) {
require_once $view_file;
$GLOBALS['FOpr']->cFile($cache_file);
$GLOBALS['FOpr']->wData($cache_file , ob_get_contents());
} else {
// 超时重新缓存
if (time() > filectime($cache_file) + CACHE_LIFE_TIME) {
require_once $view_file;
// 缓存文件超时时,先删除原缓存文件
$GLOBALS['FOpr']->dFile($cache_file);
// 新建同名缓存文件
//(新建文件时,filectime 获取文件创建时间一直没更新!这个怎么破??
// 这导致我没法重新生成缓存文件了!)
$GLOBALS['FOpr']->cFile($cache_file);
// 写入缓存
$GLOBALS['FOpr']->wData($cache_file , ob_get_contents() , 'w');
} else {
// 加载缓存文件
require_once $cache_file;
}
}
} else {
// 显示动态文件(非缓存)
require_once $view_file;
}
就你的应用场景而言:
filemtime 能更好的完成Cache的超时判断逻辑;
文件是可以不删除的,因为重新写入后,filemtime会变;
你删除文件肯定有原因,但是请看答案下的「题外」
就PHP的删除、创建文件而言
笔者用如下代码做了个试验
$path = __DIR__.'/test.txt';
file_put_contents($path, 'content1');
echo filectime($path),PHP_EOL;
unlink($path);
sleep(2);
file_put_contents($path, 'content2');
echo filectime($path),PHP_EOL;
结果:
windows (windows 10 x64)
返回时间的确一样,当我第二次执行时,时间仍然同第一次的一样。
但是我的确看到了这个txt消失了2秒后,再被生成。这也许在windows下有这样的逻辑存在(未深究),如图是我第二次执行后得到的文件属性:
linux下 CentOS
返回的时间,会变
题外
在我写的或者我看到的一些file cache引擎中,read cache操作,即使检测到超时,也并未删除Cache文件。
这里并不是偷懒,毕竟unlink很容易
而是减少必要的i/o请求,以及并发带来的unlink的风险(自己想一下为什么?)
再说,按照惯性思维,既然你在访问此cache,那么此cache肯定会被复写的,所以删除后重建的意义不太大
唯一的问题是磁盘空间占用问题,比如一些很久没人访问的cache仍然占用空间,对于这种情况,我们一般选择容忍,或者自己实现代码用定时任务去删除
smarty编译文件和你的场景类似,他的做法是:不删
内容总结
以上是互联网集市为您收集整理的php删除文件后重建,文件创建时间(filectime)未变化怎么解决??全部内容,希望文章能够帮你解决php删除文件后重建,文件创建时间(filectime)未变化怎么解决??所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。