WordPress как на ладони
Черная пятница на хостинге fornex.com! Новые WordPress шаблоны

PHP функции filectime() fileatime() filemtime()

Функции PHP filectime() fileatime() filemtime() очень похожи друг на друга и, когда ими нужно воспользоваться, легко запутаться, какая функция, какую метку времени получает. В этой заметке попробуем разобраться, какие метки времени сохраняются при создании, изменении или чтении файлов.

Из документации

filectime( $file_path ) (create)

Возвращает время последнего изменения указанного файла. Изменяется при создании, изменении файла.

Эта функция проверяет наличие изменений в Inode файла, и обычных изменений. Изменения Inode - это изменение разрешений, владельца, группы и других метаданных.

filemtime( $file_path ) (modified)
Возвращает время последнего изменения контента файла. Изменяется при изменении контента файла.
fileatime( $file_path ) (access)

Возвращает время последнего доступа к файлу. Изменяется при чтении файла (не всегда).

Заметка: на большинстве серверах такие обновления времени доступа к файлу отключены, так как эта функция снижает производительность приложений, регулярно обращающихся к файлам.

Возвращают

Число/false. Число в формате Unix или false при неудаче.

Все функции кэшируют результат. Чтобы сбросить кэш используйте функцию clearstatcache().

Пример кэша. Если в одном PHP процессе сначала использовать одну из «функции», а затем изменить данные или контент файла (использовать touch(), file_put_contents()) и попробовать снова использовать «функции», то функции вернут первый результат, хотя на самом деле он изменился.

Примеры

Результат будет зависеть от настроек сервера. На Бегете Функции работают так:

$file = FC_PARSER_PATH . 'info/_temp_test_file';
@ unlink( $file );
file_put_contents( $file, 'content' );

$__echo = function() use ($file){
	clearstatcache(); // очищаем кэш

	echo time() ."\t time()\n";
	echo filectime( $file ) ."\t filectime()\n";
	echo filemtime( $file ) ."\t filemtime()\n";
	echo fileatime( $file ) ."\t fileatime()\n";
};

$__echo();

sleep(1);
echo "\n\nchmod()\n";
chmod( $file, 0777 );
$__echo();

sleep(1);
echo "\n\nfile_get_contents()\n";
file_get_contents( $file );
$__echo();

sleep(1);
echo "\n\nfile_put_contents()\n";
file_put_contents( $file, 'content2' );
$__echo();

echo "\n\ntouch()\n";
touch( $file, 22222222222, 33333333333 );
touch( $file, 44444444444, 55555555555 );
$__echo();

Получим (без кэша):

1540437788   time()
1540437788   filectime()
1540437788   filemtime()
1540437788   fileatime()

chmod()
1540437789   time()
1540437789   filectime()
1540437788   filemtime()
1540437788   fileatime()

file_get_contents()
1540437790   time()
1540437789   filectime()
1540437788   filemtime()
1540437788   fileatime()

file_put_contents()
1540437791   time()
1540437791   filectime()
1540437791   filemtime()
1540437788   fileatime()

touch()
1540437791   time()
1540437791   filectime()
44444444444  filemtime()
55555555555  fileatime()

По результату можно сказать:

Функция Меняет Не меняет
chmod() ctime mtime, atime
file_put_contents() ctime и mtime atime
touch() ctime, mtime, atime -
file_get_contents() может менять atime ctime, mtime, atime

file_get_contents() ничего не меняет в этом примере, потому что изменение atime часто отключено на сервере для производительности.

Получим (с кэшем):

Если отключить сброс кэша (закомментировать clearstatcache()), то получим:

1540437873   time()
1540437873   filectime()
1540437873   filemtime()
1540437873   fileatime()

chmod()
1540437874   time()
1540437873   filectime()
1540437873   filemtime()
1540437873   fileatime()

file_get_contents()
1540437875   time()
1540437873   filectime()
1540437873   filemtime()
1540437873   fileatime()

file_put_contents()
1540437876   time()
1540437873   filectime()
1540437873   filemtime()
1540437873   fileatime()

touch()
1540437876   time()
1540437873   filectime()
1540437873   filemtime()
1540437873   fileatime()
Комментариев нет
    Здравствуйте, !     Войти . Зарегистрироваться