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:
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:
- premennej prostredia
PHPRC, - vo Windows zo záznamu v registri
IniFilePath, - aktuálneho pracovného adresára, okrem SAPI, ktoré to vypínajú, napríklad CLI,
- adresára binárneho súboru PHP, resp. modulu,
- cesty
--with-config-file-pathnastavenej 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().
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é.
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.
- php.ini príslušnej SAPI
- Doplnkové súbory zo skenovaného adresára, abecedne
- Konfigurácia servera: pool FPM s
php_value, resp.php_admin_value, VirtualHost Apache - Úroveň adresára:
.htaccesspri mod_php,.user.inipri FPM a CGI - 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.
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ť.
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.
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,
.htaccessa.user.ini. - Nastaviť zámky: V rámci zabezpečenia servera (hardening) 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á.