Налаштування PHP задаються на кількох рівнях, і не кожне можна змінити будь-де. Для кожної директиви в документації вказано режим:
INI_SYSTEM- лише вphp.iniчи конфігурації сервера:opcache.memory_consumption,opcache.preload,disable_functions.INI_PERDIR- ще й у.user.ini(для FPM/CGI) чи.htaccess(Apache з mod_php):upload_max_filesize,post_max_size.INI_USER- ще й у коді черезini_set().INI_ALL- усюди:memory_limit,max_execution_time,display_errors,date.timezone.
ini_set('memory_limit', '512M'); // працює
ini_set('upload_max_filesize', '50M'); // не подіє: тіло запиту вже розібране
Звідки PHP бере налаштування:
php --ini # які файли завантажено
php -i | grep memory # поточні значення (CLI!)
CLI і FPM часто мають різні php.ini (/etc/php/8.4/cli/php.ini і /etc/php/8.4/fpm/php.ini). Класична пастка: в консолі memory_limit=-1, а веб-запити падають на 128 МБ. Значення для FPM дивляться через phpinfo() у веб-запиті чи статусну сторінку.
Пули PHP-FPM можуть перевизначати налаштування: php_admin_value[memory_limit] = 256M (не можна змінити з коду) і php_value[...] (можна).
У Docker налаштування кладуть окремим файлом у /usr/local/etc/php/conf.d/ - він перевизначає дефолти без редагування основного php.ini.
Рекомендації для проду: display_errors=Off, log_errors=On, expose_php=Off, налаштований date.timezone, OPcache з validate_timestamps=0 і скиданням при деплої. Зміни в php.ini вимагають перезапуску FPM.