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:
- proměnné prostředí
PHPRC, - ve Windows z položky registru
IniFilePath, - aktuálního pracovního adresáře, kromě SAPI, která to vypínají, například CLI,
- adresáře binárního souboru PHP resp. modulu,
- 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.
- php.ini příslušného SAPI
- Doplňkové soubory ze skenovaného adresáře, abecedně
- Konfigurace serveru: pool FPM s
php_valueresp.php_admin_value, VirtualHost Apache - Úroveň adresáře:
.htaccessu mod_php,.user.iniu FPM a CGI - 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.
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ů,
.htaccessa.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.