Ukratko: php.ini je središnja konfiguracijska datoteka PHP-a. PHP je čita pri pokretanju, kod modula poslužitelja jednom, kod CGI-ja i CLI-ja pri svakom pozivu. Uz nju dolaze dodatne datoteke iz direktorija za skeniranje, postavke u FPM poolu ili u Apacheu, .htaccess odnosno .user.ini te ini_set() u kodu. Koja razina smije promijeniti vrijednost, određuje njezin način promjene, na primjer INI_SYSTEM ili INI_PERDIR. Vrijednosti postavljene putem php_admin_value aplikacija više ne može nadjačati.
Što je php.ini?
php.ini je tekstualna datoteka s unosima po uzorku name = wert. Određuje kako se PHP ponaša: koliko memorije skripta smije koristiti, pojavljuju li se pogreške u pregledniku, kako rade sesije i koje se ekstenzije učitavaju. Komentari počinju točkom sa zarezom.
Prema PHP priručniku datoteka se čita pri pokretanju PHP-a. Kod modula poslužitelja poput mod_php-a to se događa samo jednom, pri pokretanju web-poslužitelja, a kod CGI-ja i CLI-ja pri svakom pozivu. PHP-FPM konfiguraciju čita pri pokretanju i pri ponovnom učitavanju usluge. Promjena bez ponovnog pokretanja ili reloada zato najčešće ne djeluje.
Od PHP-a 8.3 unos prema priručniku može upućivati na varijablu okoline sa zamjenskom vrijednošću:
memory_limit = ${PHP_MEMORY_LIMIT}
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}
Gdje PHP traži php.ini?
Priručnik opisuje čvrst redoslijed. Prvo vrijedi izričito postavljena putanja, na primjer PHPIniDir u Apacheu ili opcija -c kod CGI-ja i CLI-ja. Inače PHP gradi putanju pretraživanja iz:
- varijable okoline
PHPRC, - pod Windowsom unosa u registru
IniFilePath, - trenutnog radnog direktorija, osim kod SAPI-ja koji to isključuju, na primjer CLI-ja,
- direktorija PHP binarne datoteke odnosno modula,
- putanje
--with-config-file-pathpostavljene pri kompiliranju.
Na toj putanji pretraživanja PHP najprije traži datoteku php-SAPI.ini, na primjer php-cli.ini, a tek potom php.ini. Zatim PHP abecednim redoslijedom čita sve .ini datoteke iz direktorija za skeniranje, koji je određen putem PHP_INI_SCAN_DIR ili pri kompiliranju putem --with-config-file-scan-dir. Koje su datoteke učitane, prikazuje php --ini ili funkcija php_ini_scanned_files().
php --ini
php -r 'var_dump(php_ini_loaded_file(), php_ini_scanned_files());'
Obje naredbe prikazuju stanje naredbenog retka. Za web-stranicu može vrijediti druga datoteka jer svaki SAPI može imati vlastitu konfiguraciju; više u članku SAPI objašnjen.
Načini promjene: tko smije postaviti koju vrijednost?
Ne smije se svaka postavka postaviti posvuda. Priručnik svakoj direktivi pridružuje način promjene:
| Način | Gdje se vrijednost smije postaviti |
|---|---|
INI_USER |
u skriptama putem ini_set(), u Windows registru i u .user.ini |
INI_PERDIR |
u php.ini, .htaccess, httpd.conf ili .user.ini |
INI_SYSTEM |
samo u php.ini ili httpd.conf |
INI_ALL |
posvuda |
Primjeri iz priručnika: memory_limit ima način INI_ALL i zadano 128M, post_max_size ima INI_PERDIR i zadano 8M, upload_max_filesize ima INI_PERDIR i zadano 2M. expose_php smije stajati samo u php.ini.
Datoteke .user.ini prema priručniku čitaju samo CGI i FastCGI SAPI-ji, dakle i PHP-FPM. PHP ih traži od direktorija skripte prema gore do Document Roota i prema zadanim postavkama ponovno ih čita najviše svakih 300 sekundi (user_ini.cache_ttl). Pod mod_php-om tu ulogu preuzima .htaccess.
Koja vrijednost vrijedi na kraju? Razine po prednosti
Pojednostavljeno vrijedi: što kasnije neka razina djeluje, to se njezina vrijednost lakše nameće, ako način promjene to dopušta.
- php.ini dotičnog SAPI-ja
- Dodatne datoteke iz direktorija za skeniranje, abecednim redoslijedom
- Konfiguracija poslužitelja: FPM pool s
php_valueodnosnophp_admin_value, Apache VirtualHost - Razina direktorija:
.htaccesskod mod_php-a,.user.inikod FPM-a i CGI-ja - Vrijeme izvođenja:
ini_set()u kodu aplikacije
Iznimka je odlučujuća: vrijednosti postavljene putem php_admin_value ili php_admin_flag prema priručniku se ne mogu nadjačati putem ini_set(). Tako administratori zaključavaju sigurnosno važne postavke od aplikacije. Detaljno je opisano u članku php_admin_value: zaključati postavke od nadjačavanja.
php.ini nakon PHP2Shella: što se promijenilo
Prijelazne mjere php.net-a za PHP2Shell gotovo su sve INI postavke: memory_limit=-1 zaključan protiv nadjačavanja, ograničen post_max_size, session.upload_progress.enabled=0 i na PHP-u 8.5 fatal_error_backtraces=0. php.net naglašava da se session.upload_progress.enabled ne smije postavljati putem ini_set() ili .user.ini, nego u php.ini, FPM poolu ili konfiguraciji poslužitelja, uz naknadno ponovno pokretanje svih workera. Cjelovit popis nalazi se na stranici Hitne mjere dok još ne možete zakrpati.
S ispravljenim verzijama 8.5.12, 8.4.27, 8.3.36 i 8.2.35 prema priručniku promijenio se i memory_limit: sada je meka granica. Nova postavka memory_hard_limit_percent određuje tvrdu granicu. Bez vlastite vrijednosti iznosi dvostruku vrijednost memory_limit, a kod više od 1G tu vrijednost plus 1G. Ako se prekorači, proces odmah završava sa statusom izlaska 137. Kako smisleno odabrati obje granice, objašnjava članak Ispravno postaviti memory_limit.
Prema priručniku vrijedi: ako PHP verzija ne prepoznaje memory_hard_limit_percent, pogođena je ranjivostima CVE-2026-109618 i CVE-2026-109619. Kod distribucija s backportovima stanje dodatno dokazuje changelog paketa.
Kako PHP SOS konkretno pomaže?
- Utvrditi djelotvorne vrijednosti: Za svaki SAPI očitavamo koje se datoteke učitavaju i koja vrijednost na kraju vrijedi.
- Pospremiti razine: Uklanjamo proturječne unose iz panela, poolova,
.htaccessi.user.ini. - Postaviti zaključavanja: U okviru ojačavanja poslužitelja sigurnosno važne vrijednosti određujemo putem
php_admin_value. - Dokazati: Dokumentiramo postavke i ponovno pokretanje kako bi se stanje kasnije moglo dokazati.
Česta pitanja
Gdje se nalazi php.ini?
To ovisi o operacijskom sustavu, paketu i SAPI-ju. Na Debianu i Ubuntuu postoje zasebne mape po verziji i SAPI-ju, na primjer /etc/php/8.3/fpm/php.ini i /etc/php/8.3/cli/php.ini. U naredbenom retku php --ini prikazuje učitane datoteke, a za web-stranicu pomaže php_ini_loaded_file() u kratkotrajnoj probnoj datoteci.
Kojim se redoslijedom čitaju datoteke u mapi conf.d?
Prema PHP priručniku PHP čita sve datoteke s nastavkom .ini u direktoriju za skeniranje abecednim redoslijedom. Kasnije datoteke nadjačavaju vrijednosti ranijih. Zato mnoge datoteke u nazivu imaju brojeve poput 20- ili 99-.
Zašto moja promjena u php.ini ne djeluje?
Česti razlozi: promijenjena je datoteka drugog SAPI-ja, usluga nije ponovno pokrenuta, vrijednost je nadjačana u FPM poolu, u Apache konfiguraciji ili u .user.ini, ili hosting panel pri sljedećem spremanju iznova piše datoteku.
Što je memory_hard_limit_percent?
Nova postavka koja je prema PHP priručniku uvedena sigurnosnim izdanjima od 21. 10. 2026. Određuje tvrdu granicu memorije kao postotak od memory_limit. Priručnik upozorava da je PHP verzija koja ne poznaje tu postavku pogođena PHP2Shell ranjivostima.