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

Функция 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
Преобразование timestamp в читаемый формат

Использование функции 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
<?php
$file = 'log.txt';
$atime = fileatime($file);
$mtime = filemtime($file);

if ($atime > $mtime) {
    echo "Файл открывали для чтения после последнего изменения.";
} else if ($atime == $mtime) {
    echo "Файл изменяли, но после этого не открывали для чтения (или открывали в момент изменения).";
} else {
    echo "Файл изменяли после последнего открытия для чтения.";
}
?>
Файл изменяли после последнего открытия для чтения.
Поиск редко используемых файлов

Пример скрипта для нахождения файлов, к которым не обращались более 30 дней.

Пример php
<?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
<?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
JavaScript (Node.js)

В 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-запросах, что является условной аналогией.

PHP fileatime function comments

En
Fileatime Gets last access time of file