Aktuální situace: PHP2Shell. Dvě kritické zranitelnosti PHP (CVSS 9.2) umožňují spustit škodlivý kód bez přihlášení. Záplaty od 21. 10. 2026.Co nyní udělat →

php.ini vysvětlen: struktura, úrovně a priorita

Kde PHP najde svá nastavení, v jakém pořadí se uplatňují a kdo je smí přepsat. Základ každého zpevnění a přechodných opatření k PHP2Shell.

Stav 4 min čteníZnalosti o PHP

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:

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().

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.

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í.

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.

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.

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 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

Okamžitý kontakt

Každá hodina se počítá. Napište nám hned.

Stručně popište systém, verzi PHP a pozorování. Ozveme se, vyjasníme situaci a budeme pracovat na dálku, dokud nebude incident uzavřen a zdokumentován.

Okamžitá pomoc