Максимальный лимит загрузки в PHP (администрирование)

Раздел: Администрирование PHP -> Конфигурация PHP

Основные методы конфигурации максимального размера загрузки

Как задать лимиты через файл php.ini?

Наиболее универсальное решение - редактирование основного конфигурационного файла PHP. Директивы upload_max_filesize, post_max_size, memory_limit и max_execution_time определяют допустимый размер загружаемого файла и общее время выполнения скрипта.

; Пример секции в php.ini
upload_max_filesize = 64M
post_max_size = 68M
memory_limit = 128M
max_execution_time = 300
max_input_time = 300

Php extension required (требуемое расширение php)

Рекомендуется устанавливать post_max_size несколько больше, чем upload_max_filesize, так как в post‑данные входят не только файл, но и другие поля формы. Значение memory_limit должно быть достаточным для обработки загружаемого файла (например, для работы с изображениями или архивами). После внесения изменений требуется перезапустить веб‑сервер или PHP‑FPM.

Частая ошибка - игнорирование ограничения post_max_size: если оно меньше upload_max_filesize, файл будет отклонён ещё до начала обработки. Симптом - пустой массив $_FILES при отправке формы. Решение - всегда задавать post_max_size > upload_max_filesize. Вторая типичная проблема - недостаточное значение memory_limit для одновременной загрузки нескольких больших файлов; в таких случаях лимит памяти увеличивают или используют потоковую обработку.

Цель использования - полный контроль над конфигурацией PHP на уровне сервера. Подходит для выделенных и виртуальных серверов, где есть доступ к основному файлу конфигурации.

Как изменить лимиты через директиву .htaccess (для Apache)?

Если сервер использует Apache с mod_php, можно задать часть директив через .htaccess в корне сайта или в отдельной директории.

php_value upload_max_filesize 32M
php_value post_max_size 36M
php_value max_execution_time 240

Php ini сервера (настройка php.ini на сервере)

Метод не работает, если PHP подключён как CGI/FastCGI (например, через PHP‑FPM). В таком случае директиву php_value Apache игнорирует. Признак - ошибка 500 Internal Server Error или отсутствие изменений.

Цель - быстрая настройка без доступа к php.ini на общих хостингах, где разрешён .htaccess.

Как применить настройки через .user.ini (для PHP‑FPM)?

PHP‑FPM поддерживает пользовательские конфигурационные файлы .user.ini (начиная с PHP 5.3). Их размещают в корневой директории проекта.

; .user.ini
upload_max_filesize = 16M
post_max_size = 20M
max_execution_time = 120

Php max upload (максимальный размер загрузки в php)

Файл проверяется при каждом запросе, перезагрузка сервера не нужна. Однако изменения применяются только к скриптам внутри той же директории.

Может конфликтовать с глобальными настройками, если не указан явно приоритет. В некоторых сборках PHP опция user_ini.filename отключена, и .user.ini игнорируется.

Цель - управление лимитами для конкретного приложения в окружении PHP‑FPM без прав на изменение php.ini.

Как установить размер загрузки динамически через функцию ini_set()?

Для временного изменения параметров внутри скрипта используется ini_set(). Однако не все директивы можно задать на этапе выполнения.

<?php
// Эти параметры можно менять только до начала загрузки
ini_set('upload_max_filesize', '10M');
ini_set('post_max_size', '12M');
// memory_limit может быть изменён, но зависит от режима работы
ini_set('memory_limit', '256M');
// max_execution_time – изменяемо
ini_set('max_execution_time', 300);
?>

Set limit php (установка лимита в php)

Директивы upload_max_filesize и post_max_size считаются PHP_INI_SYSTEM или PHP_INI_PERDIR – их нельзя изменить в режиме выполнения, если PHP собран как CGI/FastCGI. Ошибка: ini_set() не приводит к реальному изменению лимита. В таком случае необходимо использовать файлы конфигурации.

Цель - корректировка параметров для отдельных скриптов (например, для конкретного обрабатываемого файла) при работе в режиме модуля Apache.

Как настроить лимиты в веб‑сервере Nginx?

Nginx не обрабатывает PHP напрямую, но имеет собственную директиву client_max_body_size, ограничивающую размер тела запроса, передаваемого в PHP‑FPM.

server {
    listen 80;
    server_name example.com;
    client_max_body_size 50M;
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    }
}

настройка settings php (настройка файла settings.php)

Если значение client_max_body_size меньше ожидаемого размера файла, Nginx возвращает ошибку 413 (Request Entity Too Large) до того, как запрос достигнет PHP. Необходимо также синхронизировать этот параметр с post_max_size из PHP – они должны быть не меньше заданного.

Цель - корректная передача больших запросов между Nginx и PHP‑FPM.

Как изменить лимиты в конфигурационном файле пула PHP‑FPM?

Каждый пул PHP‑FPM может иметь свои настройки через директиву php_admin_value.

; /etc/php/8.1/fpm/pool.d/www.conf
php_admin_value[upload_max_filesize] = 32M
php_admin_value[post_max_size] = 36M
php_admin_value[max_execution_time] = 300

Изменения вступают в силу после перезагрузки PHP‑FPM (systemctl restart php8.1-fpm).

Если одновременно заданы значения в php.ini, .user.ini и пуле, приоритет имеет php_admin_value (самый высокий). Возможен конфликт, когда разные части приложения ожидают разных лимитов – например, для панели администрирования нужен больший размер, чем для публичной части.

Цель - детальное распределение ресурсов между несколькими сайтами или окружениями на одном сервере.

Расширенные примеры настройки и проверки

Пример 1. Скрипт проверки текущих лимитов

Пример
<?php
echo 'upload_max_filesize: ' . ini_get('upload_max_filesize') . "\n";
echo 'post_max_size: ' . ini_get('post_max_size') . "\n";
echo 'max_execution_time: ' . ini_get('max_execution_time') . "\n";
echo 'max_input_time: ' . ini_get('max_input_time') . "\n";
echo 'memory_limit: ' . ini_get('memory_limit') . "\n";
?>
upload_max_filesize: 128M
post_max_size: 132M
max_execution_time: 300
max_input_time: 300
memory_limit: 256M

Этот скрипт полезен для быстрой диагностики, какие именно лимиты действуют на сервере.

Пример 2. Форма с загрузкой большого файла и обработка ошибок

Пример
<!DOCTYPE html>
<html>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="myfile">
    <input type="submit" value="Загрузить">
</form>
</body>
</html>

<!-- upload.php -->
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_FILES['myfile']) && $_FILES['myfile']['error'] === UPLOAD_ERR_OK) {
        $uploadDir = '/var/www/uploads/';
        $tmpName = $_FILES['myfile']['tmp_name'];
        $name = basename($_FILES['myfile']['name']);
        if (move_uploaded_file($tmpName, $uploadDir . $name)) {
            echo 'Файл загружен: ' . htmlspecialchars($name);
        } else {
            echo 'Ошибка перемещения файла';
        }
    } else {
        // Анализ кода ошибки
        $errorMessages = [
            UPLOAD_ERR_INI_SIZE   => 'Размер файла превысил upload_max_filesize',
            UPLOAD_ERR_FORM_SIZE  => 'Размер файла превысил MAX_FILE_SIZE в форме',
            UPLOAD_ERR_PARTIAL    => 'Файл был загружен частично',
            UPLOAD_ERR_NO_FILE    => 'Файл не был загружен',
            UPLOAD_ERR_NO_TMP_DIR => 'Отсутствует временная папка',
            UPLOAD_ERR_CANT_WRITE => 'Ошибка записи на диск',
        ];
        $code = $_FILES['myfile']['error'] ?? UPLOAD_ERR_NO_FILE;
        echo 'Ошибка: ' . ($errorMessages[$code] ?? 'Неизвестная ошибка');
    }
}
?>

Пример демонстрирует форму и обработчик с детальным разбором ошибок, включая те, что возникают из‑за превышения лимитов.

Пример 3. Использование .htaccess вместе с директивой LimitRequestBody

Пример
# .htaccess (Apache + mod_php)
php_value upload_max_filesize 20M
php_value post_max_size 22M
# Дополнительное ограничение на стороне Apache
LimitRequestBody 22000000
(После применения форма с файлом >20M завершится ошибкой 413 от Apache, даже если PHP разрешает больший размер)

Этот приём полезен для жёсткого ограничения на уровне Apache до передачи запроса в PHP, например, для защиты от слишком больших загрузок.

Пример 4. Настройка через конфигурацию PHP в cPanel (MultiPHP INI Editor)

Пример
# Интерфейс cPanel → MultiPHP INI Editor → выбран домен
# Обязательные поля:
upload_max_filesize = 64M
post_max_size = 68M
# Сохранить

В cPanel изменения записываются в .user.ini для выбранного домена. После сохранения необходимо проверить обновлённые значения через скрипт из примера 1.

Пример 5. Обработка загрузки множественных файлов с контролем суммарного размера

Пример
<form action="multi_upload.php" method="post" enctype="multipart/form-data">
    <input type="hidden" name="MAX_FILE_SIZE" value="10485760" /> <!-- 10 MB -->
    <input type="file" name="files[]" multiple>
    <input type="submit">
</form>

<?php
// multi_upload.php
$allowedSize = 10 * 1024 * 1024; // 10 MB per file
$totalSize = 0;
foreach ($_FILES['files']['size'] as $size) {
    $totalSize += $size;
}
if ($totalSize > $allowedSize * 5) { // 5 files maximum
    die('Суммарный размер превышает лимит');
}
// дальнейшая обработка
?>

Важно: MAX_FILE_SIZE в форме действует только на стороне браузера и легко обходится. Серверная проверка суммарного размера обязательна, чтобы не исчерпать post_max_size.

Пример 6. Конфигурация PHP‑FPM с разными лимитами для разных доменов

Пример
# /etc/php/8.1/fpm/pool.d/site1.conf
[site1]
user = site1user
listen = /run/php/php8.1-fpm-site1.sock
php_admin_value[upload_max_filesize] = 10M
php_admin_value[post_max_size] = 12M

# /etc/php/8.1/fpm/pool.d/site2.conf
[site2]
user = site2user
listen = /run/php/php8.1-fpm-site2.sock
php_admin_value[upload_max_filesize] = 200M
php_admin_value[post_max_size] = 210M
php_admin_value[max_execution_time] = 600
После перезапуска PHP‑FPM каждый сайт получит свои лимиты. При попытке загрузить файл размером 150 MB на site1 будет ошибка 413, а на site2 - успешная загрузка.

Такой подход удобен для хостинг‑провайдеров или серверов с несколькими клиентскими веб-проектами.

Максимальный размер загрузки в PHP - comments

En
Php max upload (php)