Na kratko: php.ini je osrednja konfiguracijska datoteka PHP. PHP jo prebere ob zagonu, pri strežniških modulih enkrat, pri CGI in CLI ob vsakem klicu. Zraven pridejo dodatne datoteke iz imenika za pregledovanje, nastavitve v poolu FPM ali v Apacheju, .htaccess oziroma .user.ini ter ini_set() v kodi. Katera raven sme vrednost spremeniti, določa njen način spreminjanja, na primer INI_SYSTEM ali INI_PERDIR. Vrednosti prek php_admin_value aplikacija ne more več prepisati.
Kaj je php.ini?
php.ini je besedilna datoteka z vnosi po vzorcu name = wert. Določa, kako se PHP obnaša: koliko pomnilnika sme uporabiti skripta, ali se napake prikažejo v brskalniku, kako delujejo seje in katere razširitve se naložijo. Komentarji se začnejo s podpičjem.
Po priročniku PHP se datoteka prebere ob zagonu PHP. Pri strežniških modulih, kot je mod_php, se to zgodi samo enkrat, ob zagonu spletnega strežnika, pri CGI in CLI ob vsakem klicu. PHP-FPM konfiguracijo prebere ob zagonu in ob ponovnem nalaganju storitve. Sprememba brez ponovnega zagona ali reloada zato praviloma ne deluje.
Od PHP 8.3 lahko vnos po priročniku napoti na spremenljivko okolja z nadomestno vrednostjo:
memory_limit = ${PHP_MEMORY_LIMIT}
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}
Kje PHP išče php.ini?
Priročnik opisuje fiksen vrstni red. Najprej velja izrecno nastavljena pot, na primer PHPIniDir v Apacheju ali možnost -c pri CGI in CLI. Sicer PHP sestavi iskalno pot iz:
- spremenljivke okolja
PHPRC, - v sistemu Windows vnosa v registru
IniFilePath, - trenutnega delovnega imenika, razen pri SAPI, ki to izklopijo, na primer CLI,
- imenika binarne datoteke PHP oziroma modula,
- poti
--with-config-file-path, nastavljene ob prevajanju.
Na tej iskalni poti PHP najprej poišče datoteko php-SAPI.ini, na primer php-cli.ini, šele nato php.ini. Nato PHP po abecednem vrstnem redu prebere vse datoteke .ini iz imenika za pregledovanje, ki je določen prek PHP_INI_SCAN_DIR ali ob prevajanju prek --with-config-file-scan-dir. Katere datoteke so bile naložene, prikaže php --ini ali funkcija php_ini_scanned_files().
php --ini
php -r 'var_dump(php_ini_loaded_file(), php_ini_scanned_files());'
Oba ukaza prikažeta stanje ukazne vrstice. Za spletno stran lahko velja druga datoteka, ker ima lahko vsak SAPI lastno konfiguracijo; več na strani SAPI razložen.
Načini spreminjanja: kdo sme nastaviti katero vrednost?
Vsake nastavitve ni dovoljeno določiti povsod. Priročnik vsaki direktivi dodeli način spreminjanja:
| Način | Kje se vrednost sme nastaviti |
|---|---|
INI_USER |
v skriptah z ini_set(), v registru Windows in v .user.ini |
INI_PERDIR |
v php.ini, .htaccess, httpd.conf ali .user.ini |
INI_SYSTEM |
samo v php.ini ali httpd.conf |
INI_ALL |
povsod |
Primeri iz priročnika: memory_limit ima način INI_ALL in privzeto vrednost 128M, post_max_size ima INI_PERDIR in privzeto 8M, upload_max_filesize ima INI_PERDIR in privzeto 2M. expose_php sme stati samo v php.ini.
Datoteke .user.ini po priročniku berejo samo SAPI CGI in FastCGI, torej tudi PHP-FPM. PHP jih išče od imenika skripte navzgor do Document Root in jih privzeto znova prebere največ vsakih 300 sekund (user_ini.cache_ttl). Pod mod_php to vlogo prevzame .htaccess.
Katera vrednost velja na koncu? Ravni in prednost
Poenostavljeno velja: čim pozneje raven zaleže, tem bolj se njena vrednost uveljavi, če to dopušča način spreminjanja.
- php.ini posameznega SAPI
- Dodatne datoteke iz imenika za pregledovanje, po abecedi
- Konfiguracija strežnika: pool FPM s
php_valueoziromaphp_admin_value, VirtualHost Apache - Raven imenika:
.htaccesspri mod_php,.user.inipri FPM in CGI - Čas izvajanja:
ini_set()v kodi aplikacije
Izjema je odločilna: vrednosti prek php_admin_value ali php_admin_flag po priročniku ni mogoče prepisati z ini_set(). Tako skrbniki zaklenejo varnostno pomembne nastavitve pred aplikacijo. Podrobno je to opisano na strani php_admin_value: zaklepanje nastavitev pred prepisovanjem.
php.ini po PHP2Shell: kaj se je spremenilo
Prehodni ukrepi php.net proti PHP2Shell so skoraj vsi nastavitve INI: memory_limit=-1 zaklenjen pred prepisovanjem, omejena post_max_size, session.upload_progress.enabled=0 in na PHP 8.5 fatal_error_backtraces=0. php.net poudarja, da session.upload_progress.enabled ne sme biti nastavljen prek ini_set() ali .user.ini, ampak v php.ini, poolu FPM ali konfiguraciji strežnika, z naknadnim ponovnim zagonom vseh workerjev. Celoten seznam je na strani Takojšnji ukrepi, če še ne morete popraviti.
S popravljenimi različicami 8.5.12, 8.4.27, 8.3.36 in 8.2.35 se je po priročniku spremenil tudi memory_limit: zdaj je mehka meja. Nova nastavitev memory_hard_limit_percent določa trdo mejo. Brez lastne vrednosti znaša dvakratnik memory_limit, pri več kot 1G pa vrednost plus 1G. Če je presežena, se proces takoj konča z izhodnim statusom 137. Kako obe meji smiselno izbrati, razlaga Pravilna nastavitev memory_limit.
Po priročniku velja: če različica PHP memory_hard_limit_percent ne pozna, je prizadeta zaradi CVE-2026-109618 in CVE-2026-109619. Pri distribucijah z backporti stanje dodatno dokazuje dnevnik sprememb paketa.
Kako PHP SOS pomaga konkretno?
- Ugotavljanje veljavnih vrednosti: za vsak SAPI preberemo, katere datoteke se naložijo in katera vrednost na koncu velja.
- Čiščenje ravni: iz panelov, poolov,
.htaccessin.user.iniodstranimo nasprotujoče si vnose. - Nastavitev zaklepov: v okviru utrjevanja strežnika varnostno pomembne vrednosti določimo prek
php_admin_value. - Dokazovanje: nastavitve in ponovni zagon dokumentiramo, da je stanje pozneje mogoče dokazati.
Pogosta vprašanja
Kje leži php.ini?
To je odvisno od operacijskega sistema, paketa in SAPI. V Debianu in Ubuntuju so za vsako različico in SAPI lastne mape, na primer /etc/php/8.3/fpm/php.ini in /etc/php/8.3/cli/php.ini. V ukazni vrstici php --ini prikaže naložene datoteke, za spletno stran pa pomaga php_ini_loaded_file() v kratek čas odloženi preizkusni datoteki.
V kakšnem vrstnem redu se berejo datoteke v mapi conf.d?
Po priročniku PHP PHP prebere vse datoteke s končnico .ini v imeniku za pregledovanje po abecednem vrstnem redu. Poznejše datoteke prepišejo vrednosti prejšnjih. Zato imajo številne datoteke v imenu številke, kot sta 20- ali 99-.
Zakaj moja sprememba php.ini ne deluje?
Pogosti razlogi: spremenjena je bila datoteka drugega SAPI, storitev ni bila znova zagnana, vrednost v poolu FPM, v konfiguraciji Apache ali v .user.ini jo prepiše, ali pa panel za gostovanje datoteko ob naslednjem shranjevanju znova napiše.
Kaj je memory_hard_limit_percent?
Nova nastavitev, ki je bila po priročniku PHP uvedena z varnostnimi izdajami z dne 21. 10. 2026. Trdo omejitev pomnilnika določa kot odstotek memory_limit. Priročnik opozarja, da je različica PHP, ki te nastavitve ne pozna, prizadeta zaradi ranljivosti PHP2Shell.