# php.ini razložena: zgradba, ravni in prednost

> php.ini razložena: kje PHP išče konfiguracijo, katere ravni obstajajo, kaj pomenita INI_SYSTEM in INI_PERDIR ter katera vrednost na koncu velja.

Vir: https://phpsos.de/sl/php/php-ini-erklaert/  
Stanje: 25.10.2026  
Ponudnik: PHP SOS, Nujna pomoč za PHP in varnost strežnikov. Takojšnja pomoč po WhatsAppu: https://wa.me/491736494914?text=Pozdravljeni%2C%20PHP%20SOS%2C%20potrebujemo%20pomo%C4%8D%20z%20na%C5%A1im%20stre%C5%BEnikom%20PHP.%20Podjetje%3A%20%E2%80%A6%20Spletna%20stran%3A%20%E2%80%A6

**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:

```ini
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:

1. spremenljivke okolja `PHPRC`,
2. v sistemu Windows vnosa v registru `IniFilePath`,
3. trenutnega delovnega imenika, razen pri SAPI, ki to izklopijo, na primer CLI,
4. imenika binarne datoteke PHP oziroma modula,
5. 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()`.

```bash
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](https://phpsos.de/sl/php/sapi-erklaert/).

## 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.

1. **php.ini** posameznega SAPI
2. **Dodatne datoteke** iz imenika za pregledovanje, po abecedi
3. **Konfiguracija strežnika:** pool FPM s `php_value` oziroma `php_admin_value`, VirtualHost Apache
4. **Raven imenika:** `.htaccess` pri mod_php, `.user.ini` pri FPM in CGI
5. **Č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](https://phpsos.de/sl/blog/php-admin-value-sperren/).

## 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](https://phpsos.de/sl/php2shell/sofortmassnahmen-ohne-patch/).

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](https://phpsos.de/sl/blog/memory-limit-richtig-setzen/).

> **Nasvet:**
> 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, `.htaccess` in `.user.ini` odstranimo nasprotujoče si vnose.
- **Nastavitev zaklepov:** v okviru [utrjevanja strežnika](https://phpsos.de/sl/leistungen/server-haertung/) 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.

## Viri

- [Priročnik PHP: konfiguracijska datoteka](https://www.php.net/manual/en/configuration.file.php)
- [Priročnik PHP: načini spreminjanja INI](https://www.php.net/manual/en/configuration.changes.modes.php)
- [Priročnik PHP: datoteke .user.ini](https://www.php.net/manual/en/configuration.file.per-user.php)
- [Priročnik PHP: osnovne nastavitve](https://www.php.net/manual/en/ini.core.php)
