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() при изменении файла во время выполнения скрипта и преобразуйте байты в удобочитаемый формат с помощью вспомогательной функции при отображении результата пользователям.