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

Использование PHP функции filectime с подробными примерами
Раздел: Работа с файловой системой
filectime(string $filename): int|false
Описание функции filectime

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

Функция используется для аудита изменений в файловой системе, кэширования, контроля версий или построения систем мониторинга.

Синтаксис и аргументы
int|false filectime(string $filename)

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

  • $filename (string) - путь к файлу.

Возвращает целое число (Unix timestamp) или false в случае ошибки.

Базовые примеры использования
Получение времени создания файла
$file = 'document.txt';
$ctime = filectime($file);
if ($ctime !== false) {
    echo "Время последнего изменения индексного дескриптора: " . date('Y-m-d H:i:s', $ctime);
} else {
    echo "Не удалось получить время.";
}
Время последнего изменения индексного дескриптора: 2023-10-15 14:30:25
Сравнение с filemtime
$file = 'example.php';
echo "CTime: " . date('Y-m-d H:i:s', filectime($file)) . "\n";
echo "MTime: " . date('Y-m-d H:i:s', filemtime($file));
CTime: 2023-10-15 14:30:25
MTime: 2023-10-10 09:15:40
Похожие функции в PHP
  • filemtime(string $filename): int|false - возвращает время последнего изменения содержимого файла. Используется чаще, чем filectime, для проверки актуальности данных.
  • fileatime(string $filename): int|false - возвращает время последнего доступа к файлу. Может быть неточным из-за настроек файловой системы.
  • stat(string $filename): array|false - возвращает массив со всей статистикой файла, включая ctime, mtime, atime. Эффективен при необходимости получения нескольких метрик одновременно.

filectime предпочтительнее для отслеживания изменений прав доступа или владельца, тогда как filemtime - для контроля модификации содержимого.

Типичные ошибки
Отсутствие проверки существования файла
$ctime = filectime('non_existent_file.txt');
if ($ctime === false) {
    echo "Ошибка: файл не найден или нет прав доступа.";
}
Ошибка: файл не найден или нет прав доступа.
Некорректная интерпретация времени
$ctime = filectime('file.txt');
echo $ctime; // Выводит timestamp, а не читаемую дату
1697387425

Для преобразования используйте date() или DateTime.

Игнорирование кэширования stat

Функция clearstatcache() должна вызываться при многократных проверках одного файла в рамках одного скрипта.

Изменения в версиях PHP

В PHP 8.0.0 функция стала возвращать false в случае ошибки, а не 0 или false в зависимости от контекста. Это улучшило согласованность типов возвращаемых значений.

// До PHP 8.0.0
$ctime = filectime('invalid'); // мог вернуть 0

// Начиная с PHP 8.0.0
$ctime = filectime('invalid'); // возвращает false
Расширенные примеры
Мониторинг изменений в каталоге
Пример php
$directory = './logs/';
$files = scandir($directory);
$changes = [];

foreach ($files as $file) {
    if ($file !== '.' && $file !== '..') {
        $fullPath = $directory . $file;
        $ctime = filectime($fullPath);
        if ($ctime > time() - 3600) {
            $changes[] = [
                'file' => $file,
                'changed' => date('Y-m-d H:i:s', $ctime)
            ];
        }
    }
}

print_r($changes);
Array
(
    [0] => Array
        (
            [file] => error.log
            [changed] => 2023-10-15 15:45:10
        )
)
Сортировка файлов по времени изменения
Пример php
$files = ['a.txt', 'b.txt', 'c.txt'];
usort($files, function($a, $b) {
    return filectime($b) - filectime($a);
});
print_r($files);
Array
(
    [0] => c.txt
    [1] => b.txt
    [2] => a.txt
)
Определение, был ли файл перемещен
Пример php
// Если filectime изменился, а filemtime остался прежним,
// возможно, изменились метаданные (например, имя файла).
$oldCtime = filectime('old_name.txt');
rename('old_name.txt', 'new_name.txt');
$newCtime = filectime('new_name.txt');

if ($oldCtime != $newCtime) {
    echo "Метаданные файла были изменены.";
}
Метаданные файла были изменены.
Кэширование с проверкой ctime
Пример php
$cacheFile = 'data.cache';
$sourceFile = 'source.json';

if (!file_exists($cacheFile) || filectime($sourceFile) > filectime($cacheFile)) {
    // Обновляем кэш, если исходный файл изменился
    $data = file_get_contents($sourceFile);
    file_put_contents($cacheFile, json_encode($data));
    echo "Кэш обновлен.";
} else {
    echo "Используется актуальный кэш.";
}
Кэш обновлен.
Аналоги в других языках

Filectime в Python

import os
import datetime

stat_info = os.stat('document.txt')
ctime = stat_info.st_ctime
print(datetime.datetime.fromtimestamp(ctime))
2023-10-15 14:30:25
JavaScript (Node.js)
const fs = require('fs');
const stats = fs.statSync('document.txt');
console.log(new Date(stats.ctime).toISOString());
2023-10-15T14:30:25.000Z

Filectime в MySQL

SELECT ctime FROM mysql.general_log WHERE argument LIKE '%document.txt%';

В отличие от PHP, в MySQL прямой функции для получения ctime файла нет, но можно использовать системные переменные или функции файловой системы в триггерах.

PHP filectime function comments

En
Filectime Gets inode change time of file