PHPFlowPHP, MySQL, Laravel и JavaScript

php.ini: где находится и как изменить параметры PHP

Обновлено:

Коротко

Где находится php.ini, точно показывает команда php --ini в терминале или строка "Loaded Configuration File" в выводе phpinfo(). В Windows файл обычно лежит рядом с php.exe (в XAMPP это C:\xampp\php\php.ini), в Ubuntu у каждой версии и режима свой файл: /etc/php/8.3/fpm/php.ini для сайта и /etc/php/8.3/cli/php.ini для консоли. После правки параметров вроде memory_limit или upload_max_filesize перезапустите PHP-FPM или Apache, иначе изменения не вступят в силу.

Содержание
  1. Как найти php.ini, который реально используется
  2. Где лежит php.ini в Windows
  3. Где лежит php.ini в Ubuntu и Debian
  4. php.ini на хостинге
  5. Главные параметры php.ini
  6. Как увеличить memory_limit
  7. Загрузка больших файлов
  8. ini_set: изменение настроек из кода
  9. Чтение и запись своих ini-файлов в PHP
  10. Почему изменения в php.ini не применяются

Как найти php.ini, который реально используется

Файлов php.ini на одном компьютере бывает несколько: для консоли и для веб-сервера, для разных версий PHP, плюс заготовки php.ini-development и php.ini-production. Править нужно тот, который загружает нужный вам PHP, поэтому начните с проверки.

  1. Откройте терминал и выполните php --ini.
  2. Посмотрите строку "Loaded Configuration File": это путь к основному php.ini консольного PHP.
  3. Строка "Scan for additional .ini files in" показывает папку с дополнительными файлами настроек.
Как узнать, где находится php.ini, командой php --ini
Команда php --ini показывает загруженный php.ini и папку дополнительных файлов

Если вместо пути написано (none), php.ini не загружен вовсе и PHP работает на настройках по умолчанию. Скопируйте рядом с php.exe файл php.ini-development (для локальной разработки) или php.ini-production (для сервера) и переименуйте копию в php.ini.

Найти путь из консоли можно и короче:

# Linux и macOS
php -i | grep "Loaded Configuration File"
# Windows (cmd или PowerShell)
php -i | findstr "Loaded Configuration File"

Для сайта консольная команда может соврать: веб-сервер часто использует другой файл. Надёжный способ - временный PHP-файл с phpinfo() в корне сайта: в таблице ищите те же строки "Loaded Configuration File" и "Scan this dir for additional .ini files". После проверки файл сразу удалите, он раскрывает настройки сервера. Там же в первой строке видна версия, подробнее о ней в статье как узнать версию PHP.

Путь к php.ini в выводе phpinfo
Для сайта php.ini другой: phpinfo показывает файл из папки fpm, а не cli

Где лежит php.ini в Windows

УстановкаПуть к php.iniКак применить изменения
XAMPPC:\xampp\php\php.iniПерезапуск Apache в XAMPP Control Panel
Open Server Panel 6Папка config панели, отдельно для каждого модуля PHPПерезапуск модуля или панели
Отдельная установка PHPРядом с php.exe, например C:\php\php.iniПерезапуск веб-сервера или новый терминал
LaragonC:\laragon\bin\php\php-8.x\php.iniКнопка "Reload" в Laragon

В XAMPP файл удобно открыть прямо из панели: в строке Apache нажмите "Config" и выберите "PHP (php.ini)". Панель откроет именно тот файл, который загружает Apache.

Где находится php.ini в XAMPP
В XAMPP php.ini открывается из панели: Config в строке Apache, пункт PHP (php.ini)

В Open Server Panel 6 настройки PHP хранятся отдельно для каждой версии модуля, а сам файл проще всего открыть через меню панели в трее, раздел с конфигурацией модулей. Правка файла внутри папки модуля может быть перезаписана при обновлении, поэтому пользуйтесь тем путём, который показывает панель. Подробнее о структуре сборок в статьях про установку XAMPP и Open Server Panel.

Где лежит php.ini в Ubuntu и Debian

В Debian и Ubuntu путь строится по схеме /etc/php/<версия>/<режим>/php.ini. Номер версии совпадает с установленной веткой, например 8.3 в Ubuntu 24.04 или 8.5 из PPA.

/etc/php/8.3/fpm/php.ini        # сайт через nginx + PHP-FPM
/etc/php/8.3/apache2/php.ini    # сайт через Apache с mod_php
/etc/php/8.3/cli/php.ini        # консоль: cron, artisan, composer
/etc/php/8.3/fpm/conf.d/        # дополнительные .ini (модули и свои настройки)

Чтобы изменения не потерялись при обновлении пакетов, свои значения лучше вынести в отдельный файл в conf.d, а основной php.ini не трогать. Файлы из этой папки читаются по алфавиту после php.ini, поэтому имя с большим номером перекроет всё остальное:

# свой файл настроек для сайта на PHP-FPM
sudo tee /etc/php/8.3/fpm/conf.d/99-custom.ini > /dev/null <<'EOF'
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 120
EOF
sudo systemctl restart php8.3-fpm

В CentOS, AlmaLinux и Rocky Linux основной файл обычно /etc/php.ini, дополнительные лежат в /etc/php.d/. На macOS с Homebrew путь вида /opt/homebrew/etc/php/8.5/php.ini. В официальных Docker-образах php.ini по умолчанию нет, есть только заготовки в /usr/local/etc/php/: свои настройки копируют в /usr/local/etc/php/conf.d/, как показано в статье Docker для PHP.

php.ini на хостинге

На виртуальном хостинге к общему php.ini доступа нет, но изменить параметры можно тремя способами.

  • Панель управления. Большинство панелей дают поменять основные значения в настройках PHP сайта: лимит памяти, размер загрузки, время выполнения. Это самый надёжный путь.
  • Файл .user.ini в корне сайта. Работает, когда PHP запущен через FPM или CGI. Пишется в том же формате, что php.ini, и перечитывается раз в 5 минут (параметр user_ini.cache_ttl).
  • Директивы в .htaccess вида php_value memory_limit 256M. Работают только с Apache и mod_php; при PHP-FPM такая строка вызывает ошибку 500.
; .user.ini в корне сайта
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 120

На VPS, в том числе с панелью, у вас есть полный доступ: правьте файл FPM нужной версии или добавляйте свой в conf.d, затем перезапускайте службу. О том, что ещё умеет .htaccess, рассказано в статье про файл .htaccess.

Главные параметры php.ini

ПараметрЗа что отвечаетТипичное значение
memory_limitПамять на один запрос256M, для тяжёлых CMS 512M
upload_max_filesizeМаксимальный размер одного загружаемого файла64M
post_max_sizeВесь POST-запрос с файламиНе меньше upload_max_filesize
max_execution_timeВремя работы скрипта, секунды60-300
max_input_varsЧисло полей в форме3000
display_errorsПоказывать ошибки на страницеOn локально, Off на сервере
date.timezoneЧасовой пояс по умолчаниюEurope/Moscow

Синтаксис файла простой: строка параметр = значение, комментарии начинаются с точки с запятой. Размеры пишутся с буквой K, M или G, без буквы B: запись 256MB PHP не поймёт. Если параметр встречается в файле дважды, действует последнее значение, поэтому перед правкой найдите строку поиском (Ctrl + F).

Отображение ошибок подробно разобрано отдельно, в статье как включить вывод ошибок PHP.

Как увеличить memory_limit

Ошибка "Allowed memory size of 134217728 bytes exhausted" значит, что скрипт упёрся в лимит 128 МБ. Порядок действий:

  1. Откройте php.ini, путь к которому показала строка "Loaded Configuration File".
  2. Найдите строку memory_limit и поставьте memory_limit = 256M.
  3. Сохраните файл.
  4. Перезапустите PHP-FPM (sudo systemctl restart php8.3-fpm) или Apache.
  5. Проверьте новое значение: php -r "echo ini_get('memory_limit');" для консоли или phpinfo() для сайта.
Как увеличить memory_limit и upload_max_filesize в php.ini
Строки memory_limit, upload_max_filesize и post_max_size в php.ini после правки

Значение -1 снимает ограничение полностью. Для консольных задач это иногда оправдано, на сайте нет: один зациклившийся запрос займёт всю память сервера. Если скрипт регулярно просит больше 512 МБ, проблема обычно в коде: выборка всей таблицы в массив вместо постраничной обработки.

Загрузка больших файлов

Чтобы загружать файлы до 100 МБ, менять нужно сразу несколько значений, иначе сработает самый маленький лимит:

upload_max_filesize = 100M
post_max_size = 110M        ; чуть больше: в запросе есть и другие поля
max_execution_time = 300
max_input_time = 300

У nginx свой лимит на тело запроса, по умолчанию всего 1 МБ. Без него PHP даже не увидит файл, а пользователь получит ошибку 413:

server {
    # размер тела запроса, согласованный с post_max_size
    client_max_body_size 110M;
}

ini_set: изменение настроек из кода

Часть параметров можно поменять прямо в скрипте функцией ini_set(). Изменение действует только до конца текущего запроса.

<?php
declare(strict_types=1);

// Поднять лимит памяти для тяжёлого экспорта
$old = ini_set('memory_limit', '512M');
if ($old === false) {
    error_log('Не удалось изменить memory_limit');
}

ini_set('max_execution_time', '300');
echo ini_get('memory_limit'), PHP_EOL;   // 512M

// upload_max_filesize так не изменить: значение останется прежним
ini_set('upload_max_filesize', '100M');
echo ini_get('upload_max_filesize'), PHP_EOL;

Где какой параметр можно менять, определяет его режим:

РежимГде можно задатьПримеры
PHP_INI_ALLВезде, включая ini_set()memory_limit, max_execution_time, display_errors
PHP_INI_PERDIRphp.ini, .user.ini, .htaccessupload_max_filesize, post_max_size, max_input_vars
PHP_INI_SYSTEMТолько php.ini и конфигурация сервераopcache.memory_consumption, upload_tmp_dir

Чтение и запись своих ini-файлов в PHP

Формат ini удобен и для настроек вашего приложения. Функция parse_ini_file() читает файл в массив, а с флагом INI_SCANNER_TYPED превращает true, off и числа в настоящие типы.

; config.ini
[database]
host = 127.0.0.1
port = 3306
debug = off
<?php
declare(strict_types=1);

$config = parse_ini_file(__DIR__ . '/config.ini', true, INI_SCANNER_TYPED);
if ($config === false) {
    throw new RuntimeException('Не удалось прочитать config.ini');
}
var_dump($config['database']['port']);   // int(3306)
var_dump($config['database']['debug']);  // bool(false)

// Записи в ini в PHP нет: собираем строку сами
function writeIni(string $file, array $data): void
{
    $out = '';
    foreach ($data as $section => $values) {
        $out .= "[$section]\n";
        foreach ($values as $key => $value) {
            $value = is_bool($value) ? ($value ? 'true' : 'false') : $value;
            $out .= is_string($value) ? "$key = \"$value\"\n" : "$key = $value\n";
        }
        $out .= "\n";
    }
    file_put_contents($file, $out, LOCK_EX);
}

Не кладите ini-файлы с паролями в доступную из браузера папку: веб-сервер отдаст их как обычный текст. Храните их выше корня сайта.

Почему изменения в php.ini не применяются

ПричинаКак исправить
Отредактирован не тот файл (cli вместо fpm)Сверьте путь в phpinfo() сайта
PHP-FPM или Apache не перезапущенsudo systemctl restart php8.3-fpm или перезапуск в панели
Значение перекрыто файлом в conf.d или .user.iniНайдите параметр в папке из "Scan this dir"
Строка закомментирована точкой с запятойУберите ; в начале строки
Неверный формат значения (256MB)Пишите 256M
Пул FPM задаёт php_admin_valueИзмените значение в конфиге пула в pool.d

Последний случай часто встречается на серверах с панелями: значения задаются в настройках пула PHP-FPM, и через php_admin_value их не перебить ни php.ini, ни ini_set(). Меняйте их в панели или в файле пула, а затем перезапускайте службу.

Частые вопросы

Где находится php.ini?

Точный путь покажет php --ini или строка "Loaded Configuration File" в phpinfo(). В XAMPP это C:\xampp\php\php.ini, в Ubuntu /etc/php/8.3/fpm/php.ini для сайта.

Где лежит php.ini в Ubuntu?

В /etc/php/<версия>/fpm/php.ini для nginx и PHP-FPM, в /etc/php/<версия>/apache2/php.ini для Apache и в /etc/php/<версия>/cli/php.ini для консоли.

Как увеличить память в php.ini?

Поставьте memory_limit = 256M (или больше), сохраните файл и перезапустите PHP-FPM или Apache. Проверьте значение через phpinfo().

Можно ли изменить upload_max_filesize через ini_set?

Нет, это параметр режима PHP_INI_PERDIR. Меняйте его в php.ini, .user.ini или в панели хостинга.

Как изменить php.ini на хостинге без доступа к файлу?

Используйте настройки PHP в панели хостинга или создайте в корне сайта файл .user.ini с нужными строками. Изменения применятся в течение 5 минут.

Почему изменения в php.ini не работают?

Чаще всего отредактирован файл консоли вместо файла веб-сервера или не перезапущен PHP-FPM. Сверьте путь в phpinfo() и перезапустите службу.