W3docs

filesize()

Функция filesize() в PHP возвращает размер файла в байтах в виде целого числа. Узнайте синтаксис, примеры и типичные ошибки.

Что такое функция filesize()?

filesize() — встроенная функция PHP, которая возвращает размер файла в байтах в виде целого числа. Это стандартный способ узнать, сколько места на диске занимает файл, прежде чем вы его скачаете, отобразите, проверите при загрузке или решите, читать ли его в память.

На этой странице рассматриваются синтаксис, значение возвращаемого значения, важная особенность кэширования результатов, способ преобразования байтов в читаемую строку, а также безопасная обработка отсутствующих или недоступных файлов.

Синтаксис

filesize(string $filename): int|false
  • $filename — Путь к файлу. Может быть относительным, абсолютным или URL-обёрткой (например, http://, ftp://) при условии, что протокол поддерживает получение размера.
  • Возвращаемое значение — Размер файла в байтах в виде целого числа или false в случае ошибки (например, если файл не существует или у вас нет прав доступа к нему).

Поскольку размер указывается в байтах, файл со значением 2048 имеет размер 2 КБ, а 1048576 — ровно 1 МБ.

Простой пример

Пример ниже создаёт небольшой временный файл, записывает в него известную строку и выводит его размер. Предварительная запись файла делает пример полностью автономным и работоспособным:

<?php

$filename = 'example.txt';
file_put_contents($filename, 'Hello, world!'); // 13 bytes

$bytes = filesize($filename);
echo "The file '$filename' is $bytes bytes.";
// The file 'example.txt' is 13 bytes.

Строка Hello, world! содержит 13 символов ASCII, поэтому файл занимает ровно 13 байт. Для текстовых файлов в однобайтовой кодировке количество байт равно количеству символов; многобайтовые (UTF-8) символы занимают более одного байта.

filesize() работает с файлом на диске. Она не считает байты в памяти, а для символических ссылок возвращает размер целевого файла.

Обработка отсутствующего или недоступного файла

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

<?php

$filename = 'does-not-exist.txt';

if (file_exists($filename)) {
    echo filesize($filename) . " bytes";
} else {
    echo "File not found.";
}
// File not found.

Поскольку false нестрого равно 0, никогда не пишите if (filesize($f) == 0) для проверки пустого файла без предварительного подтверждения его существования — отсутствующий файл и пустой файл будут выглядеть одинаково. Используйте file_exists() для безопасной предварительной проверки.

Особенность кэширования (clearstatcache)

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

<?php

$filename = 'log.txt';
file_put_contents($filename, 'first');
echo filesize($filename) . "\n"; // 5

file_put_contents($filename, 'first-second');
clearstatcache(); // discard the cached size
echo filesize($filename) . "\n"; // 12

Без вызова clearstatcache() второй echo может по-прежнему вывести 5. Это наиболее распространённая причина «неправильных» результатов filesize().

Преобразование байтов в удобочитаемый размер

Необработанное количество байтов трудно воспринимать. Небольшая вспомогательная функция преобразует их в КБ, МБ, ГБ и т. д.:

<?php

function humanFilesize(int $bytes, int $decimals = 2): string
{
    $units = ['B', 'KB', 'MB', 'GB', 'TB'];
    $factor = (int) floor((strlen((string) $bytes) - 1) / 3);
    $value = $bytes / (1024 ** $factor);

    return number_format($value, $decimals) . ' ' . $units[$factor];
}

echo humanFilesize(13);        // 13.00 B
echo "\n";
echo humanFilesize(2048);      // 2.00 KB
echo "\n";
echo humanFilesize(1048576);   // 1.00 MB

Здесь number_format() управляет количеством знаков после запятой, а 1024 ** $factor делит на нужную степень числа 1024. Замените на round(), если нужен числовой результат без разделителей тысяч.

Когда использовать filesize()?

  • Проверка загружаемых файлов — отклоняйте файлы, превышающие допустимый размер, до их сохранения (используйте вместе с is_uploaded_file()).
  • Установка заголовков скачивания — отправляйте корректный заголовок Content-Length, чтобы браузеры могли показывать прогресс-бар.
  • Выбор способа чтения файла — для большого файла используйте потоковое чтение через fopen()/fread() вместо загрузки целиком с помощью file_get_contents().
  • Мониторинг — отслеживайте рост лог-файла по мере ожидания.

Связанные функции

  • file_exists() — проверить существование файла перед измерением его размера.
  • filemtime() — получить время последнего изменения файла.
  • filetype() — определить, является ли путь файлом, директорией или ссылкой.
  • file_get_contents() — прочитать весь файл в строку.

Итог

filesize() возвращает размер файла в байтах или false в случае ошибки. Всегда проверяйте существование файла заранее, не забывайте вызывать clearstatcache() при изменении файла во время выполнения скрипта и преобразуйте байты в удобочитаемый формат с помощью вспомогательной функции при отображении результата пользователям.

Практика

Практика
Для чего используется функция filesize() в PHP?
Для чего используется функция filesize() в PHP?
Was this page helpful?