为啥 stat() 没有显示正确的 mtime 值?

Posted

技术标签:

【中文标题】为啥 stat() 没有显示正确的 mtime 值?【英文标题】:why stat() does not show correct value of mtime?为什么 stat() 没有显示正确的 mtime 值? 【发布时间】:2019-10-10 13:41:36 【问题描述】:

我用循环创建了简单的测试函数。它有很多回声,因为我想知道到底发生了什么。注意,循环结束时有一个 die 命令,所以它不是真正的循环。我用test("523",$p); 调用该函数。这将创建变量 $fname = "523.txt" 并且 $p 可以设置为 1;我发现当我触摸文件并将其设置为 mtime、atime、10、1 等值时,stat() 不会返回正确的值。但是,如果我删除该函数(仅保留内部代码),那么 stat() 将返回正确的值 10 1; ...任何想法我的功能可能出了什么问题?

function test($n, $p)
  $fname = "$n.txt";
  echo "<h4>$n at ".time()."</h4>";
  for ($i = 0; $i<50; $i++ )
    $start = microtime(true);

    $st = stat("$fname");
    echo "; 1) previous access by ".$st['mtime']." ".$st['atime']."; ";

    $fsize = filesize($fname);
    if ($fsize === 0)
     echo "! The fsize is 0; ";    
    else
      
      $fp = fopen($fname, "r");
      $locked = flock($fp, LOCK_SH);
       $s = fread($fp, $fsize );
       $success = flock($fp, LOCK_UN);
       if ( $success === false  )
         die("; r flock release failed; ");
       $success = fclose($fp);
       if ( $success === false  )
         die("; fclose failed; ");
       // 10 - data načtená , $p - prohlížeč
       if ( $success )
          
         $result = touch("$fname",10,$p);
         echo "; TOUCH: $result;";
         
       if ( strlen($s)<60 ) 
          echo "*$s LENGTH:".strlen($s)."<br>";
      
    $st = stat("$fname");
    echo "; 2) previous access by ".$st['mtime']." ".$st['atime']."; ";
die;
  

看线:

$result = touch("$fname",10,$p);

$st = stat("$fname");

结果; 1) previous access by 1570715111 1570715111; ; TOUCH: 1;; 2) previous access by 1570715111 1570715111;

【问题讨论】:

你有没有考虑到stat 的手册中所说的——“注意:这个函数的结果是缓存的。有关详细信息,请参阅 clearstatcache()。” ...? @04FS> 非常感谢!这解决了问题。但我必须把它放在 stat() 之前,因为在脚本开头它不起作用。 【参考方案1】:

引用自这里:https://www.php.net/manual/en/function.stat.php

    Note: The results of this function are cached. See clearstatcache() for more details.

在第二次调用stat之前添加clearstatcache();

【讨论】:

以上是关于为啥 stat() 没有显示正确的 mtime 值?的主要内容,如果未能解决你的问题,请参考以下文章

从 stat().st_mtime 到 datetime?

stat

stat命令的实现-mysate

linux stat (三个时间属性命令可用来列出文件的 atimectime 和 mtime。)

stat命令

ctime 是不是总是 <= mtime?