# php.ini objašnjen: struktura, razine i prednost

> php.ini objašnjen: gdje PHP traži konfiguraciju, koje razine postoje, što znače INI_SYSTEM i INI_PERDIR i koja vrijednost na kraju vrijedi.

Izvor: https://phpsos.de/hr/php/php-ini-erklaert/  
Stanje: 25.10.2026  
Pružatelj: PHP SOS, PHP hitna pomoć i sigurnost poslužitelja. Hitna pomoć putem WhatsAppa: https://wa.me/491736494914?text=Pozdrav%20PHP%20SOS%2C%20trebamo%20pomo%C4%87%20s%20na%C5%A1im%20PHP%20poslu%C5%BEiteljem.%20Tvrtka%3A%20%E2%80%A6%20Web-stranica%3A%20%E2%80%A6

**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:

```ini
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:

1. varijable okoline `PHPRC`,
2. pod Windowsom unosa u registru `IniFilePath`,
3. trenutnog radnog direktorija, osim kod SAPI-ja koji to isključuju, na primjer CLI-ja,
4. direktorija PHP binarne datoteke odnosno modula,
5. putanje `--with-config-file-path` postavljene 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()`.

```bash
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](https://phpsos.de/hr/php/sapi-erklaert/).

## 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.

1. **php.ini** dotičnog SAPI-ja
2. **Dodatne datoteke** iz direktorija za skeniranje, abecednim redoslijedom
3. **Konfiguracija poslužitelja:** FPM pool s `php_value` odnosno `php_admin_value`, Apache VirtualHost
4. **Razina direktorija:** `.htaccess` kod mod_php-a, `.user.ini` kod FPM-a i CGI-ja
5. **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](https://phpsos.de/hr/blog/php-admin-value-sperren/).

## 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](https://phpsos.de/hr/php2shell/sofortmassnahmen-ohne-patch/).

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](https://phpsos.de/hr/blog/memory-limit-richtig-setzen/).

> **Savjet:**
> 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, `.htaccess` i `.user.ini`.
- **Postaviti zaključavanja:** U okviru [ojačavanja poslužitelja](https://phpsos.de/hr/leistungen/server-haertung/) 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.

## Izvori

- [PHP priručnik: Konfiguracijska datoteka](https://www.php.net/manual/en/configuration.file.php)
- [PHP priručnik: Načini promjene INI postavki](https://www.php.net/manual/en/configuration.changes.modes.php)
- [PHP priručnik: Datoteke .user.ini](https://www.php.net/manual/en/configuration.file.per-user.php)
- [PHP priručnik: Osnovne postavke](https://www.php.net/manual/en/ini.core.php)
