Пытаетесь загрузить в админке сайта большую фотографию, PDF-каталог или архив плагина, и то появляется сообщение «Размер файла превышает допустимый», то форма просто возвращается пустой без всякой ошибки. В обоих случаях причина чаще всего в лимитах PHP на загрузку файлов. Лимитов несколько, и они связаны между собой, поэтому увеличение только одного из них нередко ничего не даёт. Разберём, за что отвечает каждый параметр и как настроить их вместе.
Какие настройки ограничивают загрузку
Главный параметр — upload_max_filesize. Он задаёт максимальный размер одного загружаемого файла, и по умолчанию в PHP это всего 2 МБ. Второй — post_max_size — ограничивает размер всего POST-запроса, то есть сумму всех файлов и текстовых полей формы; по умолчанию 8 МБ. Третий — max_file_uploads — определяет, сколько файлов можно загрузить в одном запросе, по умолчанию 20.
Между ними есть логичный порядок: post_max_size всегда должен быть больше upload_max_filesize, ведь файл — лишь часть запроса. Если форма отправляет несколько файлов, post_max_size должен вмещать их общий объём. В документации PHP также рекомендуется, чтобы memory_limit был больше post_max_size. При долгой загрузке важны ещё max_input_time и max_execution_time.
| Параметр | Что ограничивает | По умолчанию |
|---|---|---|
upload_max_filesize | Размер одного файла | 2M |
post_max_size | Размер всего запроса | 8M |
max_file_uploads | Число файлов в одном запросе | 20 |
Хостинг-провайдеры обычно ставят значения больше стандартных, поэтому точные цифры стоит проверить на своём сайте.
Почему форма возвращается пустой без ошибки
Самая запутанная ситуация возникает, когда запрос превышает post_max_size. PHP тогда вообще не разбирает запрос: массивы $_POST и $_FILES приходят пустыми, и приложение не может показать понятную ошибку. Страница просто обновляется, введённые данные пропадают. В журнале остаётся предупреждение примерно такого вида:
PHP Warning: POST Content-Length of 52428800 bytes exceeds the limit of 8388608 bytes in Unknown on line 0
Если файл больше upload_max_filesize, но меньше post_max_size, всё яснее. Запрос принимается, но файл не сохраняется, а $_FILES['file']['error'] равен UPLOAD_ERR_INI_SIZE (1). Хорошо написанное приложение проверяет этот код и сообщает пользователю о лимите:
if ($_FILES['file']['error'] === UPLOAD_ERR_INI_SIZE) {
echo 'Файл слишком большой. Допустимый размер: ' . ini_get('upload_max_filesize');
}
413 Request Entity Too Large: лимит веб-сервера
Если после увеличения настроек PHP большой файл всё равно не загружается, а браузер показывает 413 Request Entity Too Large, запрос отклонил веб-сервер ещё до PHP. В Nginx за это отвечает client_max_body_size, по умолчанию 1 МБ. В Apache похожую роль играет LimitRequestBody. На виртуальном хостинге эти серверные настройки обычно недоступны клиенту, поэтому в такой ситуации нужно обратиться в техподдержку. На собственном VPS значение добавляется в конфигурацию Nginx, после чего сервис перезагружается:
# /etc/nginx/conf.d/example.uz.conf, внутри блока server
client_max_body_size 64m;
sudo nginx -t && sudo systemctl reload nginx
Где менять настройки
На виртуальном хостинге проще всего воспользоваться настройками PHP в панели. В ISPmanager для сайта можно изменить upload_max_filesize и post_max_size; клиенты sayt.uz входят в панель из кабинета sayt.uz. Если PHP работает в режиме FPM или CGI, подойдёт и файл .user.ini в папке сайта. Не забудьте менять оба параметра вместе:
; .user.ini
upload_max_filesize = 64M
post_max_size = 72M
max_execution_time = 120
Через ini_set() в коде эти параметры изменить нельзя. Причина простая: PHP принимает запрос до запуска скрипта и проверяет лимит именно на этом этапе, а скрипт начинает работать слишком поздно. Строка php_value в .htaccess работает только при PHP в виде модуля Apache, в остальных режимах она вызовет ошибку 500.
Чтобы проверить результат, в WordPress посмотрите надпись «Максимальный размер загружаемого файла» в окне загрузки раздела «Медиафайлы». На других сайтах достаточно временного скрипта, выводящего ini_get('upload_max_filesize').
Пример: колледж в Бухаре и видеолекции
У профессионального колледжа в Бухаре на сайте misol.uz есть раздел материалов для преподавателей. PDF-презентации по 5–10 МБ загружались без проблем, но при попытке загрузить видеолекцию на 300 МБ страница долго думала, а потом возвращалась пустой. Проверка показала, что post_max_size равен 64 МБ. Поднимать лимит выше 300 МБ здесь было бы неправильно: при медленном интернете такая загрузка идёт несколько минут, при обрыве её приходится начинать заново, а ресурсы сервера всё это время заняты. Поэтому для PDF лимит оставили 64 МБ, а видео стали размещать на видеоплатформе и встраивать на сайт только ссылку и плеер.
Другие пути для очень больших файлов
Загружать файлы в сотни мегабайт или гигабайты через браузерную форму — не лучшая идея. Гораздо надёжнее такие способы:
- Загрузка по FTP или SFTP: программы вроде FileZilla или WinSCP умеют докачивать прерванную загрузку.
- Загрузка архива через файловый менеджер панели хостинга и распаковка на самом сервере.
- Плагины и библиотеки, загружающие файл частями (chunked upload).
- Для видео — специальные видеоплатформы: они готовят ролик в разных качествах и экономят трафик хостинга.
Выбирая лимиты, исходите из того, с какими файлами сайт реально работает. Для изображений и документов обычно хватает 32–64 МБ, для более крупных файлов безопаснее альтернативные пути выше. Чрезмерно большой лимит к тому же даёт злоумышленнику возможность нагружать сервер огромными запросами.