Накратко: php.ini е централният конфигурационен файл на PHP. PHP го чете при стартиране, при сървърните модули веднъж, при CGI и CLI при всяко извикване. Към това се добавят допълнителни файлове от директория за сканиране, настройки в FPM пула или в Apache, .htaccess, респективно .user.ini, и ini_set() в кода. Кое ниво може да променя дадена стойност, определя нейният режим на промяна, например INI_SYSTEM или INI_PERDIR. Стойности чрез php_admin_value приложението вече не може да презапише.
Какво е php.ini?
php.ini е текстов файл със записи по шаблона name = wert. Той определя как се държи PHP: колко памет може да ползва един скрипт, дали грешките се показват в браузъра, как работят сесиите и кои разширения се зареждат. Коментарите започват с точка и запетая.
Според ръководството на PHP файлът се чете при стартирането на PHP. При сървърни модули като mod_php това става само веднъж, при стартирането на уеб сървъра, при CGI и CLI при всяко извикване. PHP-FPM чете конфигурацията си при стартиране и при презареждане на услугата. Промяна без рестартиране или презареждане затова най-често не действа.
От PHP 8.3 според ръководството един запис може да сочи към променлива на средата със стойност по подразбиране:
memory_limit = ${PHP_MEMORY_LIMIT}
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}
Къде PHP търси php.ini?
Ръководството описва твърд ред. Първо важи изрично зададен път, например PHPIniDir в Apache или опцията -c при CGI и CLI. Иначе PHP изгражда път за търсене от:
- променливата на средата
PHPRC, - под Windows записа в регистъра
IniFilePath, - текущата работна директория, освен при SAPI, които я изключват, например CLI,
- директорията на двоичния файл на PHP, респективно на модула,
- пътя
--with-config-file-path, зададен при компилирането.
В този път за търсене PHP търси първо файл php-SAPI.ini, например php-cli.ini, и едва след това php.ini. След това PHP чете по азбучен ред всички .ini файлове от директорията за сканиране, зададена чрез PHP_INI_SCAN_DIR или при компилирането чрез --with-config-file-scan-dir. Кои файлове са заредени, показва php --ini или функцията php_ini_scanned_files().
php --ini
php -r 'var_dump(php_ini_loaded_file(), php_ini_scanned_files());'
И двете команди показват състоянието на командния ред. За уебсайта може да важи друг файл, защото всеки SAPI може да има собствена конфигурация; повече по темата в SAPI, обяснен.
Режими на промяна: кой какви стойности може да задава?
Не всяка настройка може да се задава навсякъде. Ръководството свързва всяка директива с режим на промяна:
| Режим | Къде може да се задава стойността |
|---|---|
INI_USER |
в скриптове чрез ini_set(), в регистъра на Windows и в .user.ini |
INI_PERDIR |
в php.ini, .htaccess, httpd.conf или .user.ini |
INI_SYSTEM |
само в php.ini или httpd.conf |
INI_ALL |
навсякъде |
Примери от ръководството: memory_limit има режим INI_ALL и стойност по подразбиране 128M, post_max_size има INI_PERDIR и стойност по подразбиране 8M, upload_max_filesize има INI_PERDIR и стойност по подразбиране 2M. expose_php може да стои само в php.ini.
Файловете .user.ini според ръководството се четат само от SAPI на CGI и FastCGI, т.е. и от PHP-FPM. PHP ги търси от директорията на скрипта нагоре до Document Root и по подразбиране ги чете наново най-много на всеки 300 секунди (user_ini.cache_ttl). При mod_php тази роля поема .htaccess.
Коя стойност важи накрая? Нивата по приоритет
Опростено важи: колкото по-късно действа едно ниво, толкова по-вероятно е неговата стойност да надделее, стига режимът на промяна да го позволява.
- php.ini на съответния SAPI
- Допълнителни файлове от директорията за сканиране, по азбучен ред
- Конфигурация на сървъра: FPM пул с
php_value, респективноphp_admin_value, VirtualHost на Apache - Ниво на директория:
.htaccessпри mod_php,.user.iniпри FPM и CGI - Време на изпълнение:
ini_set()в кода на приложението
Изключението е решаващо: стойности чрез php_admin_value или php_admin_flag според ръководството не могат да бъдат презаписани чрез ini_set(). Така администраторите заключват настройките, свързани със сигурността, срещу приложението. Подробно това е описано в php_admin_value: заключване на настройки срещу презаписване.
php.ini след PHP2Shell: какво се е променило
Временните мерки на php.net за PHP2Shell са почти изцяло INI настройки: memory_limit=-1 заключен срещу презаписване, ограничен post_max_size, session.upload_progress.enabled=0 и при PHP 8.5 fatal_error_backtraces=0. php.net подчертава, че session.upload_progress.enabled не бива да се задава чрез ini_set() или .user.ini, а в php.ini, FPM пула или конфигурацията на сървъра, с последващо рестартиране на всички работни процеси. Пълният списък е в Спешни мерки, ако още не можете да направите корекция.
С поправените версии 8.5.12, 8.4.27, 8.3.36 и 8.2.35 според ръководството се е променил и memory_limit: сега той е мека граница. Новата настройка memory_hard_limit_percent задава твърда граница. Без собствена стойност тя е два пъти memory_limit, а при повече от 1G стойността плюс 1G. Ако бъде надвишена, процесът приключва веднага със статус на изход 137. Как да изберете смислено двете граници, обяснява Правилно задаване на memory_limit.
Според ръководството важи: ако една версия на PHP не познава memory_hard_limit_percent, тя е засегната от CVE-2026-109618 и CVE-2026-109619. При дистрибуции с backport корекции състоянието допълнително се доказва от дневника на промените на пакета.
Как помага PHP SOS конкретно?
- Установяване на действащите стойности: За всеки SAPI извличаме кои файлове се зареждат и коя стойност важи накрая.
- Почистване на нивата: Премахваме противоречивите записи от панели, пулове,
.htaccessи.user.ini. - Задаване на заключвания: В рамките на заздравяването на сървъра определяме настройките, свързани със сигурността, чрез
php_admin_value. - Доказване: Документираме настройките и рестартирането, за да може състоянието да бъде доказано по-късно.
Често задавани въпроси
Къде се намира php.ini?
Това зависи от операционната система, пакета и SAPI. При Debian и Ubuntu има отделни директории за всяка версия и SAPI, например /etc/php/8.3/fpm/php.ini и /etc/php/8.3/cli/php.ini. В командния ред php --ini показва заредените файлове, а за уебсайта помага php_ini_loaded_file() в кратковременен проверочен файл.
В какъв ред се четат файловете в папката conf.d?
Според ръководството на PHP PHP чете всички файлове с разширение .ini в директорията за сканиране по азбучен ред. По-късните файлове презаписват стойностите на по-ранните. Затова много файлове носят в името си числа като 20- или 99-.
Защо промяната ми в php.ini не действа?
Чести причини: променен е файлът на друг SAPI, услугата не е рестартирана, стойност в FPM пула, в конфигурацията на Apache или във файл .user.ini я презаписва, или хостинг панел пренаписва файла при следващото запазване.
Какво е memory_hard_limit_percent?
Нова настройка, въведена според ръководството на PHP с изданията за сигурност от 21.10.2026 г. Тя задава твърда граница на паметта като процент от memory_limit. Ръководството посочва, че версия на PHP, която не познава тази настройка, е засегната от уязвимостите на PHP2Shell.