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

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

Функция stat возвращает информацию о файле или символической ссылке. Она применяется для получения метаданных: размера, времени модификации, прав доступа и других атрибутов файловой системы.

Аргументы функции

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

  • filename (string) - путь к файлу или символической ссылке.
Возвращаемое значение

Возвращает индексированный массив с 13 элементами и числовыми ключами от 0 до 12, а также ассоциативные ключи. При ошибке возвращает false.

ИндексАссоциативный ключОписание
0devНомер устройства
1inoНомер inode
2modeРежим защиты inode
3nlinkКоличество ссылок
4uidИдентификатор владельца
5gidИдентификатор группы
6rdevТип устройства
7sizeРазмер в байтах
8atimeВремя последнего доступа (Unix timestamp)
9mtimeВремя последней модификации
10ctimeВремя последнего изменения inode
11blksizeРазмер блока ввода-вывода
12blocksКоличество выделенных блоков
Основные примеры использования
Получение информации о файле
<?php
$info = stat('example.txt');
print_r($info);
?>
Array
(
    [0] => 2050
    [1] => 1234567
    [2] => 33188
    [3] => 1
    [4] => 1000
    [5] => 1000
    [6] => 0
    [7] => 1024
    [8] => 1678901234
    [9] => 1678901200
    [10] => 1678901100
    [11] => 4096
    [12] => 8
    [dev] => 2050
    [ino] => 1234567
    [mode] => 33188
    [nlink] => 1
    [uid] => 1000
    [gid] => 1000
    [rdev] => 0
    [size] => 1024
    [atime] => 1678901234
    [mtime] => 1678901200
    [ctime] => 1678901100
    [blksize] => 4096
    [blocks] => 8
)
Проверка существования файла
<?php
if ($stat = stat('example.txt')) {
    echo "Файл существует, размер: " . $stat['size'] . " байт";
} else {
    echo "Файл не найден";
}
?>
Файл существует, размер: 1024 байт
Определение типа файла
<?php
$stat = stat('example.txt');
if ($stat['mode'] & 0xC000 === 0xC000) {
    echo "Сокет";
} elseif ($stat['mode'] & 0xA000 === 0xA000) {
    echo "Символическая ссылка";
} elseif ($stat['mode'] & 0x8000 === 0x8000) {
    echo "Обычный файл";
}
?>
Обычный файл
Похожие функции в PHP

Работает аналогично stat, но для символических ссылок возвращает информацию о самой ссылке, а не о целевом файле.

Принимает файловый дескриптор вместо пути к файлу. Используется для уже открытых файлов.

filemtime(), fileatime(), filectime()

Возвращают отдельные метки времени файла. Эффективнее при необходимости получить только один атрибут.

Возвращает только размер файла в байтах. Проще в использовании для получения размера.

Очищает кеш состояния файлов. Требуется после многократных проверок одного файла.

Типичные ошибки
Отсутствие проверки возвращаемого значения
<?php
$stat = stat('несуществующий_файл.txt');
echo $stat['size']; // Предупреждение и ошибка
?>
Warning: stat(): stat failed for несуществующий_файл.txt
Notice: Trying to access array offset on value of type bool
Игнорирование кеширования
<?php
$stat1 = stat('example.txt');
// Файл изменяется другим процессом
$stat2 = stat('example.txt'); // Может вернуть закешированные данные
?>

Решение - использовать clearstatcache() между вызовами.

Неверная интерпретация режима доступа
<?php
$stat = stat('example.txt');
if ($stat['mode'] == 0644) { // Неправильно
    echo "Права 0644";
}
?>

Правильный подход - маскирование битов: ($stat['mode'] & 0777) === 0644.

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

Функция теперь возвращает более точные ошибки при невозможности получить информацию о файле. Улучшена обработка символических ссылок на Windows.

PHP 7.4

Добавлена поддержка обработки путей длиной более 260 символов на Windows при использовании соответствующих настроек.

Ранние версии

В PHP 5 до версии 5.3 существовали различия в обработке символических ссылок между Windows и Unix-системами.

Расширенные примеры
Мониторинг изменений файла
Пример php
<?php
function file_changed($filename) {
    static $last_mtime = 0;
    
    $stat = stat($filename);
    if (!$stat) return false;
    
    if ($stat['mtime'] > $last_mtime) {
        $last_mtime = $stat['mtime'];
        return true;
    }
    return false;
}

// Использование
if (file_changed('config.ini')) {
    echo "Файл конфигурации изменен, перезагружаем настройки";
}
?>
Рекурсивный подсчет размера директории
Пример php
<?php
function dir_size($path) {
    $total = 0;
    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($path)
    );
    
    foreach ($files as $file) {
        if ($file->isFile()) {
            $stat = stat($file->getPathname());
            if ($stat) $total += $stat['size'];
        }
    }
    return $total;
}

echo "Размер директории: " . dir_size('/var/log') . " байт";
?>
Определение занятого места на диске
Пример php
<?php
$stat = stat('/');
$block_size = $stat['blksize'];
$blocks = $stat['blocks'];
$disk_usage = $blocks * $block_size;

echo "Занято места: " . 
     round($disk_usage / (1024*1024), 2) . " MB";
?>
Сравнение времени файлов
Пример php
<?php
$file1 = 'version1.txt';
$file2 = 'version2.txt';

$stat1 = stat($file1);
$stat2 = stat($file2);

if ($stat1 && $stat2) {
    if ($stat1['mtime'] > $stat2['mtime']) {
        echo "$file1 новее";
    } else {
        echo "$file2 новее";
    }
}
?>
Аналоги в других языках

Stat в Python

import os
stat_info = os.stat('example.txt')
print(f"Размер: {stat_info.st_size} байт")
print(f"Время модификации: {stat_info.st_mtime}")
Размер: 1024 байт
Время модификации: 1678901200.0
JavaScript (Node.js)
const fs = require('fs');
fs.stat('example.txt', (err, stats) => {
    console.log(`Размер: ${stats.size} байт`);
    console.log(`Время создания: ${stats.birthtime}`);
});
Размер: 1024 байт
Время создания: 2023-03-16T12:33:20.000Z
Bash/Shell
stat example.txt
  File: example.txt
  Size: 1024        Blocks: 8          IO Block: 4096   regular file
Device: 2050d/8270d    Inode: 1234567     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   user)   Gid: ( 1000/   group)
Access: 2023-03-16 12:33:54.000000000 +0300
Modify: 2023-03-16 12:33:20.000000000 +0300
Change: 2023-03-16 12:31:40.000000000 +0300

PHP stat function comments

En
Stat Gives information about a file