Filemtime: примеры (PHP)

Работа с функцией filemtime в PHP: практическое применение
Раздел: Работа с файловой системой
filemtime(string $filename): int|false
Функция filemtime

Функция filemtime() в PHP возвращает временную метку последнего изменения содержимого файла. Она используется для получения времени, когда данные файла были последний раз модифицированы. Это полезно для кеширования, отслеживания изменений в файлах, синхронизации данных или построения логов.

Функция принимает один обязательный аргумент:

  • filename (string) — путь к файлу, время изменения которого требуется определить. Может быть абсолютным или относительным.

Возвращаемое значение — целое число (timestamp) с временем последнего изменения в секундах с начала эпохи Unix. В случае ошибки возвращается false.

Короткие примеры использования
Получение времени изменения файла
<?
$file = 'test.txt';
$timestamp = filemtime($file);
if ($timestamp !== false) {
    echo "Последнее изменение: " . date('Y-m-d H:i:s', $timestamp);
} else {
    echo "Не удалось получить время изменения.";
}
?>
Последнее изменение: 2023-10-15 14:30:22
Проверка существования файла
<?
$file = 'отсутствующий_файл.txt';
$result = @filemtime($file);
var_dump($result);
?>
bool(false)
Использование с clearstatcache
<?
$file = 'cache.json';
echo "Первый вызов: " . filemtime($file) . "
"; // Предположим, файл был изменен внешним процессом clearstatcache(true, $file); echo "После сброса кеша: " . filemtime($file); ?>
Первый вызов: 1678886400
После сброса кеша: 1678886500
Похожие функции в PHP
  • filectime() — возвращает время изменения индексного дескриптора (inode) файла, что часто соответствует времени создания или изменения прав доступа. Подходит для отслеживания метаданных.
  • fileatime() — возвращает время последнего доступа к файлу. Менее надежна из-за настроек файловой системы, которые могут отключать обновление этого времени.
  • stat() — возвращает массив с различной статистикой файла, включая время изменения (ключ 'mtime'), доступ ( 'atime') и изменение иноды ( 'ctime'). Эффективна при необходимости получения нескольких параметров одновременно.

Для контроля изменений содержимого предпочтительнее filemtime. Функция stat() используется при комплексном анализе файла.

Типичные ошибки
Отсутствие проверки на false
<?
$time = filemtime('несуществующий_файл.txt');
echo date('Y-m-d', $time); // Предупреждение и некорректная дата
?>
Warning: filemtime(): stat failed...
1970-01-01
Игнорирование кеширования stat
<?
$file = 'часто_меняющийся.txt';
$time1 = filemtime($file);
// Файл изменен другим процессом
$time2 = filemtime($file); // Может вернуть старое значение из кеша
?>

Решением служит вызов clearstatcache(true, $file) перед повторным чтением.

Некорректная работа с символическими ссылками
<?
// filemtime() следует по символическим ссылкам
$time = filemtime('/path/to/symlink'); // Возвращает время целевого файла
?>
Изменения в PHP

В PHP 8.0 существенных изменений в поведении filemtime() не было. Однако в ранних версиях, начиная с PHP 5.0, функция стала возвращать false при ошибках, а не 0. В PHP 7.0 улучшена обработка ошибок вроде E_WARNING при сбоях. Рекомендуется использовать строгую проверку на false, особенно после перехода с версий ниже 5.0.

Расширенные примеры
Кеширование на основе времени изменения
Пример php
<?
function getCachedData($file, $cacheTime) {
    if (file_exists($file) && (time() - filemtime($file)) < $cacheTime) {
        return file_get_contents($file);
    }
    $newData = generateData();
    file_put_contents($file, $newData);
    return $newData;
}
?>
Сравнение свежести двух файлов
Пример php
<?
$file1 = 'source.xml';
$file2 = 'parsed.xml';
if (filemtime($file1) > filemtime($file2)) {
    echo "Исходный файл новее, требуется повторный парсинг.";
}
?>
Определение самого нового файла в директории
Пример php
<?
$files = glob('logs/*.log');
$newestFile = null;
$newestTime = 0;
foreach ($files as $file) {
    $mtime = filemtime($file);
    if ($mtime > $newestTime) {
        $newestTime = $mtime;
        $newestFile = $file;
    }
}
echo "Самый новый файл: $newestFile";
?>
Инвалидация кеша браузера через версию файла
Пример php
<?
$cssFile = 'styles.css';
$version = filemtime($cssFile);
echo '<link rel="stylesheet" href="styles.css?v=' . $version . '">';
?>
Мониторинг изменений в реальном времени
Пример php
<?
$watchFile = 'config.json';
$lastCheck = $_SESSION['last_file_mtime'] ?? 0;
$currentMtime = filemtime($watchFile);
if ($currentMtime !== false && $currentMtime > $lastCheck) {
    $_SESSION['last_file_mtime'] = $currentMtime;
    echo "Файл конфигурации был изменен.";
}
?>
Аналоги в других языках

Filemtime в Python

import os
import datetime

timestamp = os.path.getmtime('test.txt')
print(datetime.datetime.fromtimestamp(timestamp))
2023-10-15 14:30:22
JavaScript (Node.js)
const fs = require('fs');
const stats = fs.statSync('test.txt');
console.log(stats.mtime);
2023-10-15T11:30:22.000Z

Filemtime в MySQL

SELECT UPDATE_TIME 
FROM information_schema.tables 
WHERE table_schema = 'database_name' 
AND table_name = 'table_name';
2023-10-15 14:30:22

В отличие от PHP, Python и Node.js предоставляют объектно-ориентированный интерфейс. MySQL позволяет получить время изменения только для таблиц, а не произвольных файлов.

PHP filemtime function comments

En
Filemtime Gets file modification time