# php.ini vysvetlený: štruktúra, úrovne a priorita

> php.ini vysvetlený: kde PHP hľadá konfiguráciu, aké existujú úrovne, čo znamenajú INI_SYSTEM a INI_PERDIR a ktorá hodnota nakoniec platí.

Zdroj: https://phpsos.de/sk/php/php-ini-erklaert/  
Stav: 25.10.2026  
Poskytovateľ: PHP SOS, Núdzová pomoc pri PHP a bezpečnosť serverov. Okamžitá pomoc cez WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20de%C5%88%2C%20PHP%20SOS%2C%20potrebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20serverom%20s%20PHP.%20Spolo%C4%8Dnos%C5%A5%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**Stručne:** php.ini je centrálny konfiguračný súbor PHP. PHP ho číta pri štarte, pri serverových moduloch raz, pri CGI a CLI pri každom volaní. K tomu pristupujú doplnkové súbory zo skenovaného adresára, nastavenia v poole FPM alebo v Apache, `.htaccess`, resp. `.user.ini` a `ini_set()` v kóde. Ktorá úroveň smie hodnotu zmeniť, určuje jej režim zmeny, napríklad `INI_SYSTEM` alebo `INI_PERDIR`. Hodnoty cez `php_admin_value` už aplikácia prepísať nemôže.

## Čo je php.ini?

php.ini je textový súbor so záznamami podľa vzoru `name = wert`. Určuje, ako sa PHP správa: koľko pamäte smie skript použiť, či sa chyby zobrazujú v prehliadači, ako pracujú relácie a ktoré rozšírenia sa načítavajú. Komentáre začínajú bodkočiarkou.

Podľa príručky PHP sa súbor číta pri štarte PHP. Pri serverových moduloch ako mod_php sa to deje iba raz, pri štarte webového servera, pri CGI a CLI pri každom volaní. PHP-FPM číta svoju konfiguráciu pri štarte a pri znovunačítaní služby. Zmena bez reštartu alebo reloadu preto väčšinou nepôsobí.

Od PHP 8.3 môže záznam podľa príručky odkazovať na premennú prostredia so zástupnou hodnotou:

```ini
memory_limit = ${PHP_MEMORY_LIMIT}
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}
```

## Kde PHP hľadá php.ini?

Príručka opisuje pevné poradie. Najprv platí výslovne nastavená cesta, napríklad `PHPIniDir` v Apache alebo voľba `-c` pri CGI a CLI. Inak zostaví PHP cestu hľadania z:

1. premennej prostredia `PHPRC`,
2. vo Windows zo záznamu v registri `IniFilePath`,
3. aktuálneho pracovného adresára, okrem SAPI, ktoré to vypínajú, napríklad CLI,
4. adresára binárneho súboru PHP, resp. modulu,
5. cesty `--with-config-file-path` nastavenej pri kompilácii.

V tejto ceste hľadania PHP najprv hľadá súbor `php-SAPI.ini`, napríklad `php-cli.ini`, a až potom `php.ini`. Potom PHP prečíta všetky súbory `.ini` zo skenovaného adresára, určeného cez `PHP_INI_SCAN_DIR` alebo pri kompilácii cez `--with-config-file-scan-dir`, v abecednom poradí. Ktoré súbory sa načítali, ukazuje `php --ini` alebo funkcia `php_ini_scanned_files()`.

```bash
php --ini
php -r 'var_dump(php_ini_loaded_file(), php_ini_scanned_files());'
```

Oba príkazy ukazujú stav príkazového riadka. Pre web môže platiť iný súbor, pretože každá SAPI môže mať vlastnú konfiguráciu; viac v časti [SAPI vysvetlené](https://phpsos.de/sk/php/sapi-erklaert/).

## Režimy zmeny: kto smie nastaviť ktorú hodnotu?

Nie každé nastavenie sa smie zadať všade. Príručka priraďuje každej direktíve režim zmeny:

| Režim | Kde smie byť hodnota nastavená |
|---|---|
| `INI_USER` | v skriptoch cez `ini_set()`, v registri Windows a v `.user.ini` |
| `INI_PERDIR` | v php.ini, `.htaccess`, `httpd.conf` alebo `.user.ini` |
| `INI_SYSTEM` | iba v php.ini alebo `httpd.conf` |
| `INI_ALL` | všade |

Príklady z príručky: `memory_limit` má režim `INI_ALL` a štandard `128M`, `post_max_size` má `INI_PERDIR` a štandard `8M`, `upload_max_filesize` má `INI_PERDIR` a štandard `2M`. `expose_php` smie byť iba v php.ini.

Súbory `.user.ini` čítajú podľa príručky len SAPI CGI a FastCGI, teda aj PHP-FPM. PHP ich hľadá od adresára skriptu smerom nahor až po Document Root a štandardne ich znova číta najviac každých 300 sekúnd (`user_ini.cache_ttl`). Pod mod_php túto úlohu preberá `.htaccess`.

## Ktorá hodnota nakoniec platí? Úrovne a priorita

Zjednodušene platí: čím neskôr úroveň zasiahne, tým skôr sa jej hodnota presadí, pokiaľ to režim zmeny dovoľuje.

1. **php.ini** príslušnej SAPI
2. **Doplnkové súbory** zo skenovaného adresára, abecedne
3. **Konfigurácia servera:** pool FPM s `php_value`, resp. `php_admin_value`, VirtualHost Apache
4. **Úroveň adresára:** `.htaccess` pri mod_php, `.user.ini` pri FPM a CGI
5. **Beh:** `ini_set()` v kóde aplikácie

Výnimka je rozhodujúca: hodnoty cez `php_admin_value` alebo `php_admin_flag` sa podľa príručky nedajú prepísať cez `ini_set()`. Správcovia tak zamykajú bezpečnostne relevantné nastavenia pred aplikáciou. Podrobne je to opísané v časti [php_admin_value: zamknúť nastavenia proti prepísaniu](https://phpsos.de/sk/blog/php-admin-value-sperren/).

## php.ini po PHP2Shell: čo sa zmenilo

Prechodné opatrenia z php.net k PHP2Shell sú takmer všetky nastavenia INI: `memory_limit=-1` zamknuté proti prepísaniu, obmedzené `post_max_size`, `session.upload_progress.enabled=0` a v PHP 8.5 `fatal_error_backtraces=0`. php.net zdôrazňuje, že `session.upload_progress.enabled` sa nemá nastavovať cez `ini_set()` ani `.user.ini`, ale v php.ini, v poole FPM alebo v konfigurácii servera, s následným reštartom všetkých workerov. Úplný zoznam je na stránke [Okamžité opatrenia, ak ešte nemôžete záplatovať](https://phpsos.de/sk/php2shell/sofortmassnahmen-ohne-patch/).

S opravenými verziami 8.5.12, 8.4.27, 8.3.36 a 8.2.35 sa podľa príručky zmenil aj `memory_limit`: je teraz mäkká hranica. Nové nastavenie `memory_hard_limit_percent` určuje tvrdú hranicu. Bez vlastnej hodnoty je to dvojnásobok `memory_limit`, pri viac než `1G` hodnota plus `1G`. Pri jej prekročení proces okamžite skončí so stavom ukončenia 137. Ako obe hranice rozumne zvoliť, vysvetľuje [Správne nastavenie memory_limit](https://phpsos.de/sk/blog/memory-limit-richtig-setzen/).

> **Tip:**
> Podľa príručky platí: ak verzia PHP nepozná `memory_hard_limit_percent`, je dotknutá zraniteľnosťami CVE-2026-109618 a CVE-2026-109619. Pri distribúciách s backportmi stav navyše dokladá changelog balíka.

## Ako konkrétne pomáha PHP SOS?

- **Zistiť účinné hodnoty:** Pre každú SAPI zisťujeme, ktoré súbory sa načítavajú a ktorá hodnota nakoniec platí.
- **Upratať úrovne:** Odstraňujeme protichodné záznamy z panelov, poolov, `.htaccess` a `.user.ini`.
- **Nastaviť zámky:** V rámci [zabezpečenia servera (hardening)](https://phpsos.de/sk/leistungen/server-haertung/) určujeme bezpečnostne relevantné hodnoty cez `php_admin_value`.
- **Doložiť:** Dokumentujeme nastavenia a reštart, aby bol stav neskôr preukázateľný.


## Časté otázky

**Kde leží php.ini?**  
Závisí to od operačného systému, balíka a SAPI. V Debiane a Ubuntu existujú pre každú verziu a SAPI vlastné priečinky, napríklad /etc/php/8.3/fpm/php.ini a /etc/php/8.3/cli/php.ini. V príkazovom riadku ukáže načítané súbory php --ini, pre web pomôže php_ini_loaded_file() v krátkodobom kontrolnom súbore.

**V akom poradí sa čítajú súbory v priečinku conf.d?**  
Podľa príručky PHP číta PHP všetky súbory s príponou .ini v skenovanom adresári v abecednom poradí. Neskoršie súbory prepisujú hodnoty skorších. Preto majú mnohé súbory v názve čísla ako 20- alebo 99-.

**Prečo moja zmena v php.ini nepôsobí?**  
Časté dôvody: zmenil sa súbor inej SAPI, služba sa nereštartovala, hodnotu prepisuje nastavenie v poole FPM, v konfigurácii Apache alebo v .user.ini, alebo hostingový panel súbor pri ďalšom uložení prepíše.

**Čo je memory_hard_limit_percent?**  
Nové nastavenie, ktoré bolo podľa príručky PHP zavedené s bezpečnostnými vydaniami z 21. 10. 2026. Určuje tvrdú hranicu pamäte ako percento z memory_limit. Príručka upozorňuje, že verzia PHP, ktorá toto nastavenie nepozná, je zraniteľnosťami PHP2Shell dotknutá.

## Zdroje

- [Príručka PHP: Konfiguračný súbor](https://www.php.net/manual/en/configuration.file.php)
- [Príručka PHP: Režimy zmeny INI](https://www.php.net/manual/en/configuration.changes.modes.php)
- [Príručka PHP: Súbory .user.ini](https://www.php.net/manual/en/configuration.file.per-user.php)
- [Príručka PHP: Základné nastavenia](https://www.php.net/manual/en/ini.core.php)
