Почему PHP не даёт загрузить файл больше 2 МБ?
Вы когда-нибудь пытались загрузить на сайт фотографию в хорошем качестве, презентацию или видео, а PHP отвечал вам сухим: «The uploaded file exceeds the upload_max_filesize directive in php.ini»? Знакомо? Это классическая проблема, которая встречается на каждом втором проекте. На Stack Overflow вопрос «Change the maximum upload file size» набрал десятки тысяч просмотров — и это не случайно.
В этой статье мы разберём, как работает ограничение на загрузку файлов в PHP, где оно настраивается и как правильно увеличить лимит. Вы узнаете не только про upload_max_filesize, но и про подводные камни, которые могут свести все усилия на нет.
Как PHP ограничивает загрузку файлов?
Когда вы отправляете файл через форму, PHP проверяет его размер на нескольких уровнях. Если хотя бы один из них не пропускает — файл не загрузится. Давайте разберём три главных параметра, которые нужно изменить, чтобы change the maximum upload file size работало как надо.
1. upload_max_filesize — прямой лимит на файл
Это самый очевидный параметр. Он задаёт максимальный размер одного загружаемого файла. По умолчанию в PHP стоит 2M (2 мегабайта). Чтобы увеличить, например, до 100 МБ, нужно написать:
upload_max_filesize = 100M
2. post_max_size — размер всего POST-запроса
Вот тут многие попадаются. Даже если вы увеличили upload_max_filesize, но забыли про post_max_size, загрузка всё равно не сработает. Почему? Потому что файл передаётся внутри POST-запроса, и если размер всего запроса превышает лимит — PHP его просто обрежет.
Правило простое: post_max_size должен быть больше, чем upload_max_filesize. Обычно его ставят на 20-30% больше. Пример:
post_max_size = 120M
3. max_execution_time — время на загрузку
Большие файлы загружаются не мгновенно. Если файл весит 100 МБ, а интернет медленный, скрипт может просто не уложиться в отведённое время. По умолчанию max_execution_time = 30 секунд. Для больших файлов увеличьте до 300-600 секунд:
max_execution_time = 600
4. memory_limit — память для обработки
Некоторые PHP-скрипты загружают файл в память перед обработкой. Если memory_limit меньше размера файла — получите ошибку. Рекомендуется ставить его больше post_max_size:
memory_limit = 256M
Где и как менять настройки?
Теперь, когда мы знаем, какие параметры отвечают за change the maximum upload file size, давайте разберём, где их менять. У вас есть три основных пути:
Способ 1: php.ini (главный файл конфигурации)
Это самый надёжный способ. Найдите файл php.ini на сервере (обычно он лежит в /etc/php/ или /usr/local/etc/). Откройте его и найдите нужные директивы. Если их нет — добавьте в конец файла:
; Разрешаем загрузку файлов (должно быть On)
file_uploads = On
; Максимальный размер одного файла
upload_max_filesize = 100M
; Максимальный размер POST-запроса
post_max_size = 120M
; Время выполнения скрипта
max_execution_time = 600
; Лимит памяти
memory_limit = 256M
После изменений обязательно перезапустите веб-сервер:
sudo service apache2 restart # для Apache
sudo service nginx restart # для Nginx
Способ 2: .htaccess (только для Apache)
Если у вас нет доступа к php.ini (например, на хостинге), можно попробовать через .htaccess в корне сайта:
php_value upload_max_filesize 100M
php_value post_max_size 120M
php_value max_execution_time 600
php_value memory_limit 256M
Важно: этот способ работает только если хостинг разрешает переопределение директив через .htaccess (директива AllowOverride All).
Способ 3: Через PHP-код (в runtime)
Иногда нужно изменить лимит прямо во время выполнения скрипта. Для этого используйте функцию ini_set():
<?php
// Изменяем лимиты прямо в коде
ini_set('upload_max_filesize', '100M');
ini_set('post_max_size', '120M');
ini_set('max_execution_time', '600');
ini_set('memory_limit', '256M');
// Дальше идёт обработка загрузки
if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
// Файл загружен успешно
echo "Файл загружен!";
} else {
echo "Ошибка загрузки: " . $_FILES['file']['error'];
}
?>
Но будьте осторожны: ini_set() не всегда срабатывает. Например, upload_max_filesize можно изменить только до начала загрузки файла (до отправки формы). Если файл уже начал передаваться — поздно.
Проверяем, что всё работает
После настройки обязательно проверьте, что изменения вступили в силу. Создайте простой PHP-файл:
<?php
phpinfo();
?>
Откройте его в браузере и найдите секцию Core. Ищите значения upload_max_filesize, post_max_size, max_execution_time и memory_limit. Если они совпадают с тем, что вы задали — всё отлично. Если нет — проверьте, правильный ли файл php.ini вы редактировали (иногда их несколько).
Частые ошибки и их решения
- Ошибка UPLOAD_ERR_INI_SIZE (значение 1): Файл превышает
upload_max_filesize. Увеличьте директиву. - Ошибка UPLOAD_ERR_FORM_SIZE (значение 2): Файл превышает лимит, заданный в HTML-форме (
MAX_FILE_SIZE). Проверьте скрытое поле формы. - Пустой $_FILES после загрузки большого файла: Скорее всего,
post_max_sizeменьше размера запроса. Увеличьте его. - Ошибка 500 Internal Server Error: Проверьте логи ошибок. Часто проблема в синтаксисе
.htaccessили в неверных значениях (например, нельзя ставить пробелы). -
Блоги
Рекомендаций по книгам
Читайте также
Как вызвать Activity из другого приложения в Android: полный гайд для Kotlin
Как стать Kotlin разработчиком в 2025: полный роадмап
JSON в C# dynamic в 2025: десериализация без боли
SOLID принципы в Rust: теория и практика для разработчиков
Generics в Kotlin: зачем нужны и как использовать на практике