Текуща ситуация: PHP2Shell. Две критични уязвимости в PHP (CVSS 9,2) позволяват злонамерен код без вход. Корекции от 21.10.2026 г.Какво да направите сега →

php.ini, обяснен: структура, нива и приоритет

Къде PHP намира настройките си, в какъв ред те действат и кой може да ги презаписва. Основа за всяко заздравяване и за временните мерки срещу PHP2Shell.

Актуалност 5 мин. четенеЗнания за PHP

Накратко: 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 изгражда път за търсене от:

  1. променливата на средата PHPRC,
  2. под Windows записа в регистъра IniFilePath,
  3. текущата работна директория, освен при SAPI, които я изключват, например CLI,
  4. директорията на двоичния файл на PHP, респективно на модула,
  5. пътя --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.

Коя стойност важи накрая? Нивата по приоритет

Опростено важи: колкото по-късно действа едно ниво, толкова по-вероятно е неговата стойност да надделее, стига режимът на промяна да го позволява.

  1. php.ini на съответния SAPI
  2. Допълнителни файлове от директорията за сканиране, по азбучен ред
  3. Конфигурация на сървъра: FPM пул с php_value, респективно php_admin_value, VirtualHost на Apache
  4. Ниво на директория: .htaccess при mod_php, .user.ini при FPM и CGI
  5. Време на изпълнение: 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.

Източници

Незабавен контакт

Всеки час има значение. Пишете ни сега.

Опишете накратко системата, версията на PHP и какво сте забелязали. Ние се свързваме с Вас, уточняваме ситуацията и работим отдалечено, докато инцидентът бъде приключен и документиран.

Незабавна помощ