Как изменить максимальный размер загружаемого файла в PHP: полный гайд

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Вступление: «Файл слишком большой» — знакомая боль?

Вы когда-нибудь пытались загрузить на сайт свою фотографию в высоком разрешении, видео для блога или 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

Блоги

Рекомендаций по книгам