# php.ini, обяснен: структура, нива и приоритет

> php.ini, обяснен: къде PHP търси конфигурацията си, какви нива има, какво значат INI_SYSTEM и INI_PERDIR и коя стойност важи накрая.

Източник: https://phpsos.de/bg/php/php-ini-erklaert/  
Актуалност: 25.10.2026  
Доставчик: PHP SOS, Спешна помощ за PHP и сигурност на сървъри. Незабавна помощ по WhatsApp: https://wa.me/491736494914?text=%D0%97%D0%B4%D1%80%D0%B0%D0%B2%D0%B5%D0%B9%D1%82%D0%B5%2C%20PHP%20SOS%2C%20%D0%B8%D0%BC%D0%B0%D0%BC%D0%B5%20%D0%BD%D1%83%D0%B6%D0%B4%D0%B0%20%D0%BE%D1%82%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%20%D1%81%20%D0%BD%D0%B0%D1%88%D0%B8%D1%8F%20PHP%20%D1%81%D1%8A%D1%80%D0%B2%D1%8A%D1%80.%20%D0%A4%D0%B8%D1%80%D0%BC%D0%B0%3A%20%E2%80%A6%20%D0%A3%D0%B5%D0%B1%D1%81%D0%B0%D0%B9%D1%82%3A%20%E2%80%A6

**Накратко:** 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 според ръководството един запис може да сочи към променлива на средата със стойност по подразбиране:

```ini
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()`.

```bash
php --ini
php -r 'var_dump(php_ini_loaded_file(), php_ini_scanned_files());'
```

И двете команди показват състоянието на командния ред. За уебсайта може да важи друг файл, защото всеки SAPI може да има собствена конфигурация; повече по темата в [SAPI, обяснен](https://phpsos.de/bg/php/sapi-erklaert/).

## Режими на промяна: кой какви стойности може да задава?

Не всяка настройка може да се задава навсякъде. Ръководството свързва всяка директива с режим на промяна:

| Режим | Къде може да се задава стойността |
|---|---|
| `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: заключване на настройки срещу презаписване](https://phpsos.de/bg/blog/php-admin-value-sperren/).

## 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 пула или конфигурацията на сървъра, с последващо рестартиране на всички работни процеси. Пълният списък е в [Спешни мерки, ако още не можете да направите корекция](https://phpsos.de/bg/php2shell/sofortmassnahmen-ohne-patch/).

С поправените версии 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](https://phpsos.de/bg/blog/memory-limit-richtig-setzen/).

> **Съвет:**
> Според ръководството важи: ако една версия на PHP не познава `memory_hard_limit_percent`, тя е засегната от CVE-2026-109618 и CVE-2026-109619. При дистрибуции с backport корекции състоянието допълнително се доказва от дневника на промените на пакета.

## Как помага PHP SOS конкретно?

- **Установяване на действащите стойности:** За всеки SAPI извличаме кои файлове се зареждат и коя стойност важи накрая.
- **Почистване на нивата:** Премахваме противоречивите записи от панели, пулове, `.htaccess` и `.user.ini`.
- **Задаване на заключвания:** В рамките на [заздравяването на сървъра](https://phpsos.de/bg/leistungen/server-haertung/) определяме настройките, свързани със сигурността, чрез `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: Конфигурационният файл](https://www.php.net/manual/en/configuration.file.php)
- [Ръководство на PHP: Режими на промяна на INI](https://www.php.net/manual/en/configuration.changes.modes.php)
- [Ръководство на PHP: Файлове .user.ini](https://www.php.net/manual/en/configuration.file.per-user.php)
- [Ръководство на PHP: Основни настройки](https://www.php.net/manual/en/ini.core.php)
