Вступление: «Файл слишком большой» — знакомая боль?
Вы когда-нибудь пытались загрузить на сайт свою фотографию в высоком разрешении, видео для блога или ZIP-архив с документами, и вдруг видели безжалостную ошибку: «Превышен максимальный размер загружаемого файла»? Если да — вы не одиноки. На Stack Overflow вопрос «Change the maximum upload file size» собрал десятки тысяч просмотров, а это значит, что сотни тысяч разработчиков (от новичков до профи) сталкивались с этой стеной.
На образовательном портале PythonLib мы учим не просто копировать код, а понимать, как всё работает изнутри. Сегодня мы на пальцах, с живыми примерами, разберём, как изменить лимит загрузки в PHP. Вы узнаете, где прячутся настройки, почему они не всегда работают и как обойти самые частые грабли. Поехали!
Почему PHP не даёт загружать большие файлы?
По умолчанию PHP — довольно скромный парень. Он разрешает загружать файлы размером всего 2 мегабайта (а в некоторых старых версиях — и того меньше). Это сделано в целях безопасности: представьте, что злоумышленник зальёт на ваш сервер гигабайтный файл и положит сайт. Но для легальных задач (например, загрузка портфолио или видеоурока) этого катастрофически мало.
Откуда берётся лимит? Ответ — из трёх главных директив в конфигурации PHP:
upload_max_filesize— максимальный размер одного загружаемого файла.post_max_size— максимальный размер всех данных, отправленных методом POST (включая файлы и текстовые поля формы).max_execution_time— время, которое PHP может тратить на выполнение скрипта (загрузка большого файла может занять минуты).
Если вы увеличите только upload_max_filesize, но забудете про post_max_size, загрузка всё равно упадёт с ошибкой. Это как пытаться засунуть слона в багажник, когда багажник меньше самого слона. Или когда у вас есть большая коробка (файл), но дверца почтового ящика (post_max_size) слишком узкая.
Где живут настройки PHP? Три пути к успеху
У вас есть три способа изменить максимальный размер загружаемого файла. Какой выбрать — зависит от вашего хостинга и уровня доступа. Давайте разберём каждый.
Способ 1. Редактируем php.ini (золотой стандарт)
Файл php.ini — это главный «пульт управления» PHP. Если у вас есть доступ к серверу (VPS, выделенный сервер или локальный компьютер), это самый надёжный способ.
Найдите ваш php.ini. Обычно он лежит в:
- Linux:
/etc/php/8.x/apache2/php.iniили/etc/php/8.x/cli/php.ini - Windows:
C:\xampp\php\php.ini(для XAMPP) илиC:\wamp64\bin\php\php8.x\php.ini
Откройте файл и найдите (или добавьте) следующие строки:
; Максимальный размер одного файла (теперь 50 МБ)
upload_max_filesize = 50M
; Максимальный размер всех POST-данных (должен быть больше или равен upload_max_filesize)
post_max_size = 64M
; Максимальное время выполнения скрипта в секундах (для больших файлов увеличьте до 300)
max_execution_time = 300
; Максимальное время на получение данных (рекомендуется поставить не менее 5 минут)
max_input_time = 300
; Память на один скрипт (если файл большой, увеличьте до 128M или 256M)
memory_limit = 128M
После изменений обязательно перезапустите веб-сервер:
sudo systemctl restart apache2 # для Apache
sudo systemctl restart nginx # для Nginx
Готово! Теперь ваш сайт может принимать файлы до 50 МБ. Но помните: post_max_size всегда должен быть на несколько мегабайт больше, чем upload_max_filesize, чтобы хватило места на служебные заголовки формы.
Способ 2. Магия .htaccess (для shared-хостинга)
Если у вас дешёвый хостинг и доступа к php.ini нет — не отчаивайтесь. Часто хостинг-провайдеры разрешают переопределять настройки PHP через файл .htaccess (работает только на Apache).
Создайте (или отредактируйте) файл .htaccess в корне вашего сайта и добавьте туда:
# Увеличиваем лимит загрузки до 100 МБ
php_value upload_max_filesize 100M
php_value post_max_size 105M
php_value max_execution_time 360
php_value max_input_time 360
Важно: директива php_value работает только если хостинг разрешает её использование. Если после сохранения файла сайт выдаёт ошибку 500 — значит, ваш хостинг блокирует такие настройки. Тогда переходите к следующему способу.
Способ 3. Прямо в коде: ini_set() (экстренный вариант)
Некоторые настройки можно изменить прямо в PHP-скрипте перед обработкой загрузки. Это работает не для всех директив (например, upload_max_filesize можно изменить только до начала загрузки), но попробовать стоит.
<?php
// В самом начале скрипта, до любой HTML-разметки
ini_set('upload_max_filesize', '50M');
ini_set('post_max_size', '64M');
ini_set('max_execution_time', '300');
ini_set('max_input_time', '300');
// Теперь ваш скрипт может обработать загрузку
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
echo "Файл загружен! Размер: " . $_FILES['file']['size'] . " байт";
}
?>
Подводный камень: ini_set() срабатывает только в runtime, но сам PHP уже прочитал лимиты из php.ini до запуска вашего скрипта. Поэтому этот метод часто не работает для upload_max_filesize на многих хостингах. Но для max_execution_time — работает отлично!
А что, если у вас Nginx? Ловушка для новичков
Многие начинающие разработчики настраивают PHP, а загрузка большого файла всё равно падает. Секрет прост: если ваш сайт работает через Nginx как reverse proxy (что очень распространено), то Nginx имеет собственный лимит на размер тела запроса. И этот лимит по умолчанию — всего 1