Как узнать размер файла в PHP: методы и практические примеры

Раздел: Программирование на PHP -> Работа с файловой системой

Определение размера файла в PHP: основные методы и рекомендации

Как получить размер файла на сервере с помощью встроенной функции filesize?

Функция filesize() возвращает размер файла в байтах. Это самый простой и распространённый способ. Синтаксис: filesize(string $filename): int|false. Если файл не существует или недоступен для чтения, функция возвращает false и генерирует ошибку уровня E_WARNING.


$filename = 'example.txt';
$size = filesize($filename);
if ($size === false) {
    echo 'Ошибка при получении размера файла';
} else {
    echo "Размер: $size байт";
}

Php get extension (получение информации о файлах в php)

Типичная ошибка: При работе с большими файлами (более 2 ГБ) на 32-битных системах filesize() может вернуть отрицательное число из-за переполнения целого. Для корректной работы рекомендуется использовать 64-битную версию PHP или альтернативные методы (например, stat() с ключом 'size', который на 32-битных системах может также давать некорректные значения). Для обхода можно применять библиотеки или системные утилиты.

Проблема кэширования: Результат filesize() может кэшироваться. Если файл изменяется в течение одного запроса, нужно вызвать clearstatcache() перед повторным вызовом.

Как узнать размер файла с использованием функции stat?

Функция stat() возвращает массив со статистикой файла, включая размер в элементе с ключом 'size' (или числовым индексом 7). Это может быть полезно, если помимо размера нужны другие данные (дата изменения, права доступа и т.д.).


$file = 'document.pdf';
$stat = stat($file);
if ($stat === false) {
    echo 'Не удалось получить статистику файла';
} else {
    $size = $stat['size']; // или $stat[7]
    echo "Размер: $size байт";
}

Index php file 1 (работа с файлами и папками на php)

Ошибка: Если файл не найден, функция возвращает false и выдаёт предупреждение. Также stat() подвержена проблеме больших файлов на 32-битных системах.

Как получить размер открытого файла через дескриптор?

Если файл уже открыт (например, для чтения), можно использовать fstat(). Она принимает дескриптор, полученный от fopen(), и возвращает массив, аналогичный stat(), но для открытого потока.


$handle = fopen('data.csv', 'r');
if ($handle) {
    $fstat = fstat($handle);
    $size = $fstat['size'];
    echo "Размер открытого файла: $size байт";
    fclose($handle);
} else {
    echo 'Не удалось открыть файл';
}

Php запись в файл (запись в файл php)

Примечание: fstat() работает только с локальными файлами. Для удалённых ресурсов (например, URL) результат не будет актуальным.

Как узнать размер удалённого файла по URL?

Для файлов, доступных по HTTP/HTTPS, можно использовать CURL с опцией CURLOPT_NOBODY, чтобы получить только заголовки, не скачивая сам файл. Размер будет в заголовке Content-Length.


$url = 'https://example.com/largefile.zip';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
curl_close($ch);

if ($httpCode == 200 && $size > 0) {
    echo "Размер удалённого файла: $size байт";
} else {
    echo 'Не удалось определить размер (возможно, сервер не отдаёт Content-Length)';
}

Php изменить файл (изменение файла в php)

Проблема: Не все серверы возвращают заголовок Content-Length. В таких случаях размер останется неизвестным.

Как использовать SplFileInfo для получения размера?

Объектно-ориентированный подход: класс SplFileInfo предоставляет метод getSize(), который внутри вызывает filesize(), но с дополнительными проверками.


$fileInfo = new SplFileInfo('image.jpg');
if ($fileInfo->isFile()) {
    $size = $fileInfo->getSize();
    echo "Размер: $size байт";
} else {
    echo 'Файл не существует';
}

Php несколько файлов (несколько файлов в php)

Ошибка: Метод getSize() возвращает false, если файл не существует. Необходима проверка isFile() для избежания ошибок.

Как получить размер директории (суммарный размер всех файлов)?

Стандартные функции не дают размер папки напрямую. Можно рекурсивно обойти все файлы и сложить их размеры.


function dirSize($dir) {
    $size = 0;
    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS)
    );
    foreach ($files as $file) {
        $size += $file->getSize();
    }
    return $size;
}

$folderSize = dirSize('/path/to/folder');
echo "Размер папки: $folderSize байт";

Производительность: Для больших каталогов операция может быть затратной. Рекомендуется кэшировать результат.

- Php папка файла (папка файла php)
- Php размер файла (размер файла php)
- Php создание файла (создание файла в php)

Расширенные примеры использования функций для определения размера файла

Ниже приведены дополнительные сценарии с подробными пояснениями и выводом результатов.

Пример 1. Обработка ошибок при использовании filesize

Пример

$file = 'nonexistent.txt';
if (file_exists($file)) {
    $size = filesize($file);
    echo "Размер: $size байт";
} else {
    echo 'Файл не найден';
}
// Вывод: Файл не найден

Пример 2. Сброс кэша stat перед повторным вызовом filesize

Пример

$file = 'log.txt';
echo "Первый вызов: " . filesize($file) . "\n";
// ... файл изменяется внешним процессом ...
clearstatcache(true, $file);
echo "После сброса кэша: " . filesize($file) . "\n";
Первый вызов: 1024
После сброса кэша: 2048

Пример 3. Использование stat для получения дополнительных данных

Пример

$info = stat('document.pdf');
if ($info) {
    echo "Размер: {$info['size']} байт";
    echo "Последнее изменение: " . date('Y-m-d H:i:s', $info['mtime']);
}
Размер: 567890 байт
Последнее изменение: 2025-03-15 14:30:00

Пример 4. Определение размера открытого файла с помощью fstat

Пример

$handle = fopen('data.bin', 'rb');
$stat = fstat($handle);
echo "Размер через fstat: {$stat['size']} байт";
fclose($handle);
Размер через fstat: 1234567 байт

Пример 5. Получение размера удалённого файла через CURL (с проверкой статуса)

Пример

$url = 'https://www.php.net/distributions/php-8.4.10.tar.bz2';
$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_NOBODY => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER => true,
    CURLOPT_FOLLOWLOCATION => true
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
curl_close($ch);

if ($httpCode == 200 && $size > 0) {
    echo "Размер файла: $size байт (" . round($size / 1024 / 1024, 2) . " МБ)";
} else {
    echo "Не удалось определить размер. HTTP код: $httpCode";
}
Размер файла: 127456789 байт (121.56 МБ)

Пример 6. Рекурсивный подсчёт размера папки с исключением маленьких файлов

Пример

function dirSizeFiltered($dir, $minSize = 0) {
    $size = 0;
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS)
    );
    foreach ($iterator as $file) {
        if ($file->isFile() && $file->getSize() >= $minSize) {
            $size += $file->getSize();
        }
    }
    return $size;
}

$folder = '/tmp/myapp';
echo "Размер папки (файлы >= 1 КБ): " . dirSizeFiltered($folder, 1024) . " байт";
Размер папки (файлы >= 1 КБ): 123456789 байт

Пример 7. Обработка больших файлов с помощью shell_exec (альтернатива для 32-битных систем)

Пример

$file = 'bigfile.iso';
$size = shell_exec("stat -c%s " . escapeshellarg($file));
if ($size !== null) {
    echo "Размер (через stat командной строки): " . trim($size) . " байт";
} else {
    echo "Ошибка выполнения команды";
}
Размер (через stat командной строки): 4294967296 байт

Размер файла PHP - comments

En
Php размер файла (php)