登录  /  注册

php删除文件后重建,文件创建时间(filectime)未变化怎么解决??

php中文网
发布: 2016-10-11 14:23:31
原创
1383人浏览过

  1. php 创建文件名为 test.html 的文件,使用 filectime 获取创建时间 t1

  2. php 删除文件名为 test.html 的文件

  3. php 重新创建文件名为 test.html 的文件,使用 filectime 获取创建时间 t2

为什么 t1 = t2 ?? 就是创建时间为什么没更新?? 我使用了 clearstatcache 函数清除文件状态缓存也没点用,这个怎么解决??(由于在判断是否重新生成缓存文件的时候,需要知道缓存文件的创建时间,所以很重要..,求解决~)
下面是出现这种情况的问题的代码(有点密,请耐心看下哈):

<code>     // 页面缓存
     if ((defined('DEBUG_MODE') &amp;&amp; !DEBUG_MODE) &amp;&amp; (defined('CACHE_CONTROL') &amp;&amp; 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']-&gt;checkFile($cache_file)) {
            require_once $view_file;
            $GLOBALS['FOpr']-&gt;cFile($cache_file);
            $GLOBALS['FOpr']-&gt;wData($cache_file , ob_get_contents());
         } else {
            // 超时重新缓存
            if (time() &gt; filectime($cache_file) + CACHE_LIFE_TIME) {
                require_once $view_file;
                // 缓存文件超时时,先删除原缓存文件
                $GLOBALS['FOpr']-&gt;dFile($cache_file);
                // 新建同名缓存文件
                //(新建文件时,filectime 获取文件创建时间一直没更新!这个怎么破??
                // 这导致我没法重新生成缓存文件了!)
                $GLOBALS['FOpr']-&gt;cFile($cache_file); 
                // 写入缓存
                $GLOBALS['FOpr']-&gt;wData($cache_file , ob_get_contents() , 'w');
            } else {
                // 加载缓存文件
                require_once $cache_file;
            }
         }
     } else {
         // 显示动态文件(非缓存)
         require_once $view_file;
     }</code>
登录后复制
登录后复制

回复内容:

  1. php 创建文件名为 test.html 的文件,使用 filectime 获取创建时间 t1

  2. php 删除文件名为 test.html 的文件

  3. php 重新创建文件名为 test.html 的文件,使用 filectime 获取创建时间 t2

为什么 t1 = t2 ?? 就是创建时间为什么没更新?? 我使用了 clearstatcache 函数清除文件状态缓存也没点用,这个怎么解决??(由于在判断是否重新生成缓存文件的时候,需要知道缓存文件的创建时间,所以很重要..,求解决~)
下面是出现这种情况的问题的代码(有点密,请耐心看下哈):

<code>     // 页面缓存
     if ((defined('DEBUG_MODE') &amp;&amp; !DEBUG_MODE) &amp;&amp; (defined('CACHE_CONTROL') &amp;&amp; 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']-&gt;checkFile($cache_file)) {
            require_once $view_file;
            $GLOBALS['FOpr']-&gt;cFile($cache_file);
            $GLOBALS['FOpr']-&gt;wData($cache_file , ob_get_contents());
         } else {
            // 超时重新缓存
            if (time() &gt; filectime($cache_file) + CACHE_LIFE_TIME) {
                require_once $view_file;
                // 缓存文件超时时,先删除原缓存文件
                $GLOBALS['FOpr']-&gt;dFile($cache_file);
                // 新建同名缓存文件
                //(新建文件时,filectime 获取文件创建时间一直没更新!这个怎么破??
                // 这导致我没法重新生成缓存文件了!)
                $GLOBALS['FOpr']-&gt;cFile($cache_file); 
                // 写入缓存
                $GLOBALS['FOpr']-&gt;wData($cache_file , ob_get_contents() , 'w');
            } else {
                // 加载缓存文件
                require_once $cache_file;
            }
         }
     } else {
         // 显示动态文件(非缓存)
         require_once $view_file;
     }</code>
登录后复制
登录后复制

就你的应用场景而言:

  • filemtime 能更好的完成Cache的超时判断逻辑;

  • 文件是可以不删除的,因为重新写入后,filemtime会变;

  • 你删除文件肯定有原因,但是请看答案下的「题外」

就PHP的删除、创建文件而言

笔者用如下代码做了个试验

<code>$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;</code>
登录后复制

结果:

windows (windows 10 x64)

返回时间的确一样,当我第二次执行时,时间仍然同第一次的一样。
但是我的确看到了这个txt消失了2秒后,再被生成。这也许在windows下有这样的逻辑存在(未深究),如图是我第二次执行后得到的文件属性:

php删除文件后重建,文件创建时间(filectime)未变化怎么解决??

linux下 CentOS

返回的时间,会变

题外

在我写的或者我看到的一些file cache引擎中,read cache操作,即使检测到超时,也并未删除Cache文件

  • 这里并不是偷懒,毕竟unlink很容易

  • 而是减少必要的i/o请求,以及并发带来的unlink的风险(自己想一下为什么?)

  • 再说,按照惯性思维,既然你在访问此cache,那么此cache肯定会被复写的,所以删除后重建的意义不太大

  • 唯一的问题是磁盘空间占用问题,比如一些很久没人访问的cache仍然占用空间,对于这种情况,我们一般选择容忍,或者自己实现代码用定时任务去删除

  • smarty编译文件和你的场景类似,他的做法是:不删

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号