# php.ini vysvětlen: struktura, úrovně a priorita

> php.ini vysvětlen: kde PHP hledá konfiguraci, jaké existují úrovně, co znamenají INI_SYSTEM a INI_PERDIR a která hodnota nakonec platí.

Zdroj: https://phpsos.de/cs/php/php-ini-erklaert/  
Stav: 25.10.2026  
Poskytovatel: PHP SOS, Nouzová pomoc pro PHP a bezpečnost serverů. Okamžitá pomoc přes WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20den%2C%20PHP%20SOS%2C%20pot%C5%99ebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20PHP%20serverem.%20Firma%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**Stručně:** php.ini je centrální konfigurační soubor PHP. PHP jej čte při spuštění, u serverových modulů jednou, u CGI a CLI při každém volání. K tomu přistupují doplňkové soubory ze skenovaného adresáře, nastavení v poolu FPM nebo v Apache, `.htaccess` resp. `.user.ini` a `ini_set()` v kódu. Která úroveň smí hodnotu změnit, určuje její režim změny, například `INI_SYSTEM` nebo `INI_PERDIR`. Hodnoty nastavené přes `php_admin_value` už aplikace přepsat nemůže.

## Co je php.ini?

php.ini je textový soubor se zápisy podle vzoru `name = wert`. Určuje, jak se PHP chová: kolik paměti smí skript použít, zda se chyby zobrazují v prohlížeči, jak pracují relace a která rozšíření se načítají. Komentáře začínají středníkem.

Podle příručky PHP se soubor čte při spuštění PHP. U serverových modulů, jako je mod_php, se to děje jen jednou, při spuštění webového serveru, u CGI a CLI při každém volání. PHP-FPM čte svou konfiguraci při spuštění a při opětovném načtení služby. Změna bez restartu nebo reloadu proto většinou nepůsobí.

Od PHP 8.3 může podle příručky položka odkazovat na proměnnou prostředí se záložní hodnotou:

```ini
memory_limit = ${PHP_MEMORY_LIMIT}
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}
```

## Kde PHP hledá php.ini?

Příručka popisuje pevné pořadí. Nejprve platí výslovně nastavená cesta, například `PHPIniDir` v Apache nebo volba `-c` u CGI a CLI. Jinak PHP sestaví cestu hledání z:

1. proměnné prostředí `PHPRC`,
2. ve Windows z položky registru `IniFilePath`,
3. aktuálního pracovního adresáře, kromě SAPI, která to vypínají, například CLI,
4. adresáře binárního souboru PHP resp. modulu,
5. cesty nastavené při kompilaci `--with-config-file-path`.

V této cestě hledá PHP nejdříve soubor `php-SAPI.ini`, například `php-cli.ini`, a teprve potom `php.ini`. Poté PHP čte v abecedním pořadí všechny soubory `.ini` ze skenovaného adresáře, který je určen přes `PHP_INI_SCAN_DIR` nebo při kompilaci přes `--with-config-file-scan-dir`. Které soubory byly načteny, ukáže `php --ini` nebo funkce `php_ini_scanned_files()`.

```bash
php --ini
php -r 'var_dump(php_ini_loaded_file(), php_ini_scanned_files());'
```

Oba příkazy ukazují stav příkazové řádky. Pro web může platit jiný soubor, protože každé SAPI může mít vlastní konfiguraci; více v článku [SAPI vysvětleno](https://phpsos.de/cs/php/sapi-erklaert/).

## Režimy změn: kdo smí nastavit kterou hodnotu?

Ne každé nastavení smí být provedeno všude. Příručka přiřazuje každé direktivě režim změny:

| Režim | Kde smí být hodnota nastavena |
|---|---|
| `INI_USER` | ve skriptech přes `ini_set()`, v registru Windows a v `.user.ini` |
| `INI_PERDIR` | v php.ini, `.htaccess`, `httpd.conf` nebo `.user.ini` |
| `INI_SYSTEM` | jen v php.ini nebo `httpd.conf` |
| `INI_ALL` | všude |

Příklady z příručky: `memory_limit` má režim `INI_ALL` a výchozí hodnotu `128M`, `post_max_size` má `INI_PERDIR` a výchozí hodnotu `8M`, `upload_max_filesize` má `INI_PERDIR` a výchozí hodnotu `2M`. `expose_php` smí být jen v php.ini.

Soubory `.user.ini` čtou podle příručky jen SAPI CGI a FastCGI, tedy i PHP-FPM. PHP je hledá od adresáře skriptu směrem nahoru až po Document Root a standardně je znovu čte nanejvýš každých 300 sekund (`user_ini.cache_ttl`). U mod_php tuto roli přebírá `.htaccess`.

## Která hodnota nakonec platí? Úrovně podle priority

Zjednodušeně platí: čím později úroveň zasáhne, tím spíše se její hodnota prosadí, pokud to režim změny dovoluje.

1. **php.ini** příslušného SAPI
2. **Doplňkové soubory** ze skenovaného adresáře, abecedně
3. **Konfigurace serveru:** pool FPM s `php_value` resp. `php_admin_value`, VirtualHost Apache
4. **Úroveň adresáře:** `.htaccess` u mod_php, `.user.ini` u FPM a CGI
5. **Běh:** `ini_set()` v kódu aplikace

Výjimka je rozhodující: hodnoty nastavené přes `php_admin_value` nebo `php_admin_flag` nelze podle příručky přepsat přes `ini_set()`. Správci tak uzamykají bezpečnostně relevantní nastavení vůči aplikaci. Podrobně to popisuje článek [php_admin_value: uzamknout nastavení proti přepsání](https://phpsos.de/cs/blog/php-admin-value-sperren/).

## php.ini po PHP2Shell: co se změnilo

Přechodná opatření z php.net k PHP2Shell jsou téměř všechna nastavení INI: `memory_limit=-1` uzamčené proti přepsání, omezené `post_max_size`, `session.upload_progress.enabled=0` a u PHP 8.5 `fatal_error_backtraces=0`. php.net zdůrazňuje, že `session.upload_progress.enabled` se nemá nastavovat přes `ini_set()` ani `.user.ini`, ale v php.ini, poolu FPM nebo konfiguraci serveru, s následným restartem všech workerů. Úplný seznam najdete v článku [Okamžitá opatření, když ještě nelze záplatovat](https://phpsos.de/cs/php2shell/sofortmassnahmen-ohne-patch/).

S opravenými verzemi 8.5.12, 8.4.27, 8.3.36 a 8.2.35 se podle příručky změnil i `memory_limit`: je nyní měkký limit. Nové nastavení `memory_hard_limit_percent` určuje tvrdý limit. Bez vlastní hodnoty činí dvojnásobek `memory_limit`, při více než `1G` hodnotu plus `1G`. Při jeho překročení proces okamžitě skončí se stavem 137. Jak oba limity rozumně zvolit, vysvětluje článek [Správné nastavení memory_limit](https://phpsos.de/cs/blog/memory-limit-richtig-setzen/).

> **Tip:**
> Podle příručky platí: pokud verze PHP nezná `memory_hard_limit_percent`, je postižena zranitelnostmi CVE-2026-109618 a CVE-2026-109619. U distribucí s backporty stav dokládá navíc changelog balíčku.

## Jak konkrétně pomáhá PHP SOS?

- **Zjistit účinné hodnoty:** Pro každé SAPI načteme, které soubory se načítají a která hodnota nakonec platí.
- **Uklidit úrovně:** Odstraníme rozporuplné záznamy z panelů, poolů, `.htaccess` a `.user.ini`.
- **Nastavit uzamčení:** V rámci [zpevnění serveru](https://phpsos.de/cs/leistungen/server-haertung/) stanovíme bezpečnostně relevantní hodnoty přes `php_admin_value`.
- **Doložit:** Nastavení a restart zdokumentujeme, aby byl stav později prokazatelný.


## Časté dotazy

**Kde leží php.ini?**  
Záleží na operačním systému, balíčku a SAPI. V Debianu a Ubuntu existují pro každou verzi a SAPI samostatné adresáře, například /etc/php/8.3/fpm/php.ini a /etc/php/8.3/cli/php.ini. V příkazové řádce ukáže načtené soubory php --ini, pro web pomůže php_ini_loaded_file() v krátce nahraném kontrolním souboru.

**V jakém pořadí se čtou soubory v adresáři conf.d?**  
Podle příručky PHP čte PHP všechny soubory s příponou .ini ve skenovaném adresáři v abecedním pořadí. Pozdější soubory přepisují hodnoty dřívějších. Proto mnoho souborů nese v názvu čísla jako 20- nebo 99-.

**Proč moje změna v php.ini nepůsobí?**  
Časté důvody: byl změněn soubor jiného SAPI, služba nebyla restartována, hodnotu přepisuje nastavení v poolu FPM, v konfiguraci Apache nebo v souboru .user.ini, nebo hostingový panel soubor při příštím uložení přepíše.

**Co je memory_hard_limit_percent?**  
Nové nastavení, které bylo podle příručky PHP zavedeno s bezpečnostními vydáními z 21. 10. 2026. Určuje tvrdý limit paměti jako procento z memory_limit. Příručka upozorňuje, že verze PHP, která toto nastavení nezná, je zranitelnostmi PHP2Shell postižena.

## Zdroje

- [Příručka PHP: Konfigurační soubor](https://www.php.net/manual/en/configuration.file.php)
- [Příručka PHP: Režimy změn INI](https://www.php.net/manual/en/configuration.changes.modes.php)
- [Příručka PHP: Soubory .user.ini](https://www.php.net/manual/en/configuration.file.per-user.php)
- [Příručka PHP: Základní nastavení](https://www.php.net/manual/en/ini.core.php)
