Filectime: примеры (PHP)
filectime(string $filename): int|falseФункция 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
$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
- 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.
Функция clearstatcache() должна вызываться при многократных проверках одного файла в рамках одного скрипта.
В PHP 8.0.0 функция стала возвращать false в случае ошибки, а не 0 или false в зависимости от контекста. Это улучшило согласованность типов возвращаемых значений.
// До PHP 8.0.0
$ctime = filectime('invalid'); // мог вернуть 0
// Начиная с PHP 8.0.0
$ctime = filectime('invalid'); // возвращает false$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
)
)$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
)// Если filectime изменился, а filemtime остался прежним,
// возможно, изменились метаданные (например, имя файла).
$oldCtime = filectime('old_name.txt');
rename('old_name.txt', 'new_name.txt');
$newCtime = filectime('new_name.txt');
if ($oldCtime != $newCtime) {
echo "Метаданные файла были изменены.";
}Метаданные файла были изменены.
$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
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 файла нет, но можно использовать системные переменные или функции файловой системы в триггерах.