почему stat() не показывает правильное значение mtime?

Я создал простую функцию тестирования с циклом. Это имеет много отголосков, потому что я хочу знать, что именно происходит. Обратите внимание, что в конце цикла есть команда 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;


person Johny Bony    schedule 10.10.2019    source источник
comment
Приняли ли вы во внимание то, что говорится в руководстве для stat«Примечание: результаты этой функции кэшируются. Подробнее см. в clearstatcache(). …?   -  person 04FS    schedule 10.10.2019
comment
@04FS› Большое спасибо! Это решает проблему. Но я должен поставить его перед stat(), потому что в начале скрипта он не действует.   -  person Johny Bony    schedule 10.10.2019


Ответы (1)


Цитата отсюда: https://www.php.net/manual/en/function.stat.php

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

Просто добавьте clearstatcache(); перед вызовом stat во второй раз.

person AterLux    schedule 10.10.2019