Fileatime: примеры (PHP)
fileatime(string $filename): int|falseФункция fileatime в PHP
Функция fileatime() в языке PHP возвращает временную метку (timestamp) последнего доступа к указанному файлу. Доступом считается любая операция чтения файла, включая его открытие для чтения, получение метаданных (например, через функции stat() или fstat()) в некоторых файловых системах и окружениях.
Эта функция применяется в сценариях, где требуется отслеживать или анализировать активность работы с файлами: системы мониторинга, кеширования, очистки неиспользуемых файлов или логирования.
Функция принимает единственный обязательный аргумент:
- $filename (string) - путь к файлу, время последнего доступа к которому необходимо получить.
Возвращаемое значение - целое число (int), представляющее временную метку Unix (количество секунд, прошедших с 1 января 1970 года), либо false в случае возникновения ошибки (например, если файл не существует).
Примеры использования fileatime
Базовый пример вызова функции.
<?php
$file = 'example.txt';
$atime = fileatime($file);
if ($atime !== false) {
echo "Время последнего доступа: ". $atime;
} else {
echo "Не удалось получить время доступа.";
}
?>Время последнего доступа: 1678886400
Использование функции date() для форматирования результата.
<?php
$atime = fileatime('document.pdf');
echo "Файл открывали: ". date('Y-m-d H:i:s', $atime);
?>Файл открывали: 2023-03-15 14:30:00
Аналогичные функции в PHP
Возвращает время последнего изменения содержимого файла. Эта функция более полезна для определения, обновлялся ли файл, и часто используется для инвалидации кеша.
Возвращает время изменения индексного дескриптора (inode) файла. В Windows это время создания файла. Меняется при изменении прав доступа, владельца или содержимого файла.
Возвращает массив с полной статистикой файла, включая все три временные метки (atime, mtime, ctime) и другую информацию. Использование stat() предпочтительнее, если требуется получить несколько параметров файла за один системный вызов.
Типичные ошибки
Самая частая ошибка - попытка получить время доступа к несуществующему файлу. Функция вернет false.
<?php
$result = fileatime('несуществующий_файл.txt');
var_dump($result);
?>bool(false)
Если файл существует, но у скрипта нет прав на чтение его атрибутов, функция также вернет false.
Функция работает с путями к файлам. При передаче пути к директории поведение может отличаться в зависимости от операционной системы и настроек файловой системы. Всегда стоит проверять, является ли целевой объект файлом, с помощью is_file().
Изменения в PHP 8
В PHP 8 не было внесено значительных изменений в поведение функции fileatime(). Однако, с переходом на PHP 8 рекомендуется учитывать более строгую типизацию. Функция по-прежнему возвращает значение типа int|false. Важно отметить, что в некоторых файловых системах (например, при использовании отложенной записи или определенных настроек монтирования) обновление времени доступа может быть отключено, что влияет на результат работы функции независимо от версии PHP.
Расширенные примеры
Сценарий для определения, читался ли файл после его последнего редактирования.
<?php
$file = 'log.txt';
$atime = fileatime($file);
$mtime = filemtime($file);
if ($atime > $mtime) {
echo "Файл открывали для чтения после последнего изменения.";
} else if ($atime == $mtime) {
echo "Файл изменяли, но после этого не открывали для чтения (или открывали в момент изменения).";
} else {
echo "Файл изменяли после последнего открытия для чтения.";
}
?>Файл изменяли после последнего открытия для чтения.
Пример скрипта для нахождения файлов, к которым не обращались более 30 дней.
<?php
$directory = './cache/';
$files = scandir($directory);
$now = time();
$interval = 30 * 24 * 60 * 60; // 30 дней в секундах
foreach ($files as $file) {
$path = $directory . $file;
if (is_file($path)) {
$atime = fileatime($path);
if (($now - $atime) > $interval) {
echo "Файл $file не использовался более 30 дней.\n";
}
}
}
?>Файл old_data.json не использовался более 30 дней. Файл temp_backup.zip не использовался более 30 дней.
Чтобы избежать частых обращений к файловой системе при множественных проверках, результат можно кешировать.
<?php
function getCachedFileAtime($filename, &$cache = []) {
if (!array_key_exists($filename, $cache)) {
$cache[$filename] = fileatime($filename);
}
return $cache[$filename];
}
$atimeCache = [];
echo getCachedFileAtime('large.pdf', $atimeCache); // Системный вызов
echo getCachedFileAtime('large.pdf', $atimeCache); // Значение из массива
?>1678886400 1678886400
Аналоги функции в других языках
Fileatime в Python
В Python используется функция os.path.getatime() из модуля os.path или метод st_atime объекта, возвращаемого os.stat().
import os
atime = os.path.getatime('example.txt')
print(atime) # Вывод в секундах
stat_info = os.stat('example.txt')
print(stat_info.st_atime) # Альтернативный способ1678886400.1234567
В Node.js информация получается через метод stat() модуля fs, который возвращает объект Stats с полем atime (объект Date) и atimeMs (метка в миллисекундах).
const fs = require('fs');
fs.stat('example.txt', (err, stats) => {
console.log(stats.atime);
console.log(stats.atimeMs);
});2023-03-15T11:30:00.123Z 1678886400123
Fileatime в MySQL
Прямого аналога для файловой системы нет. Для получения времени доступа к записям в таблице используются поля типа TIMESTAMP, которые можно обновлять триггерами при SELECT-запросах, что является условной аналогией.