# php.ini paaiškinta: sandara, lygiai ir pirmenybė

> php.ini paaiškinta: kur PHP ieško konfigūracijos, kokie yra lygiai, ką reiškia INI_SYSTEM ir INI_PERDIR bei kuri reikšmė galiausiai galioja.

Šaltinis: https://phpsos.de/lt/php/php-ini-erklaert/  
Būsena: 2026-10-25  
Teikėjas: PHP SOS, PHP avarinė pagalba ir serverio sauga. Skubi pagalba per „WhatsApp“: https://wa.me/491736494914?text=Sveiki%2C%20PHP%20SOS%2C%20mums%20reikia%20pagalbos%20su%20m%C5%ABs%C5%B3%20PHP%20serveriu.%20%C4%AEmon%C4%97%3A%20%E2%80%A6%20Svetain%C4%97%3A%20%E2%80%A6

**Trumpai:** php.ini yra pagrindinis PHP konfigūracijos failas. PHP jį nuskaito paleidimo metu: serverio moduliams vieną kartą, CGI ir CLI per kiekvieną iškvietimą. Be to, yra papildomi failai iš nuskaitymo katalogo, nustatymai FPM baseine ar Apache, `.htaccess` arba `.user.ini` ir `ini_set()` kode. Kuris lygis gali keisti reikšmę, nustato jos keitimo režimas, pavyzdžiui, `INI_SYSTEM` ar `INI_PERDIR`. Reikšmių, nustatytų per `php_admin_value`, programa perrašyti nebegali.

## Kas yra php.ini?

php.ini yra tekstinis failas su įrašais pagal šabloną `name = wert`. Jis nustato, kaip elgiasi PHP: kiek atminties gali naudoti skriptas, ar klaidos rodomos naršyklėje, kaip veikia sesijos ir kurie plėtiniai įkeliami. Komentarai prasideda kabliataškiu.

Pasak PHP vadovo, failas skaitomas paleidžiant PHP. Serverio moduliams, tokiems kaip mod_php, tai vyksta tik vieną kartą, paleidžiant žiniatinklio serverį, CGI ir CLI atveju per kiekvieną iškvietimą. PHP-FPM savo konfigūraciją skaito paleidžiant ir perkraunant tarnybą. Todėl pakeitimas be paleidimo iš naujo ar perkrovimo (reload) dažniausiai neveikia.

Nuo PHP 8.3, pasak vadovo, įrašas gali nurodyti aplinkos kintamąjį su atsargine reikšme:

```ini
memory_limit = ${PHP_MEMORY_LIMIT}
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}
```

## Kur PHP ieško php.ini?

Vadovas aprašo fiksuotą tvarką. Pirmiausia galioja aiškiai nustatytas kelias, pavyzdžiui, `PHPIniDir` Apache arba parinktis `-c` CGI ir CLI atveju. Kitu atveju PHP sudaro paieškos kelią iš:

1. aplinkos kintamojo `PHPRC`,
2. sistemoje Windows registro įrašo `IniFilePath`,
3. dabartinio darbo katalogo, išskyrus SAPI, kurios tai išjungia, pavyzdžiui, CLI,
4. PHP dvejetainio failo arba modulio katalogo,
5. kompiliavimo metu nustatyto kelio `--with-config-file-path`.

Šiame paieškos kelyje PHP pirmiausia ieško failo `php-SAPI.ini`, pavyzdžiui, `php-cli.ini`, ir tik po to `php.ini`. Po to PHP abėcėlės tvarka nuskaito visus `.ini` failus iš nuskaitymo katalogo, nustatyto per `PHP_INI_SCAN_DIR` arba kompiliavimo metu per `--with-config-file-scan-dir`. Kurie failai įkelti, rodo `php --ini` arba funkcija `php_ini_scanned_files()`.

```bash
php --ini
php -r 'var_dump(php_ini_loaded_file(), php_ini_scanned_files());'
```

Abi komandos rodo komandinės eilutės būseną. Svetainei gali galioti kitas failas, nes kiekviena SAPI gali turėti savo konfigūraciją; daugiau skyriuje [SAPI paaiškinta](https://phpsos.de/lt/php/sapi-erklaert/).

## Keitimo režimai: kas kokią reikšmę gali nustatyti?

Ne kiekvieną nustatymą leidžiama nustatyti bet kur. Vadovas kiekvienai direktyvai priskiria keitimo režimą:

| Režimas | Kur galima nustatyti reikšmę |
|---|---|
| `INI_USER` | skriptuose per `ini_set()`, Windows registre ir `.user.ini` |
| `INI_PERDIR` | php.ini, `.htaccess`, `httpd.conf` ar `.user.ini` |
| `INI_SYSTEM` | tik php.ini ar `httpd.conf` |
| `INI_ALL` | bet kur |

Pavyzdžiai iš vadovo: `memory_limit` turi režimą `INI_ALL` ir numatytąją `128M`, `post_max_size` turi `INI_PERDIR` ir numatytąją `8M`, `upload_max_filesize` turi `INI_PERDIR` ir numatytąją `2M`. `expose_php` gali būti tik php.ini.

Pasak vadovo, `.user.ini` failus skaito tik CGI ir FastCGI SAPI, taigi ir PHP-FPM. PHP jų ieško nuo skripto katalogo aukštyn iki Document Root ir pagal numatymą iš naujo nuskaito ne dažniau kaip kas 300 sekundžių (`user_ini.cache_ttl`). Su mod_php šį vaidmenį perima `.htaccess`.

## Kuri reikšmė galiausiai galioja? Lygių pirmenybė

Supaprastintai galioja: kuo vėliau lygis įsigalioja, tuo labiau jo reikšmė nusveria, jei tai leidžia keitimo režimas.

1. atitinkamos SAPI **php.ini**
2. **papildomi failai** iš nuskaitymo katalogo, abėcėlės tvarka
3. **serverio konfigūracija:** FPM baseinas su `php_value` arba `php_admin_value`, Apache VirtualHost
4. **katalogo lygis:** `.htaccess` esant mod_php, `.user.ini` esant FPM ir CGI
5. **vykdymo metu:** `ini_set()` programos kode

Išimtis esminė: pasak vadovo, reikšmių, nustatytų per `php_admin_value` ar `php_admin_flag`, negalima perrašyti per `ini_set()`. Taip administratoriai užrakina saugumui svarbius nustatymus nuo programos. Išsamiai tai aprašyta skyriuje [php_admin_value: nustatymų užrakinimas nuo perrašymo](https://phpsos.de/lt/blog/php-admin-value-sperren/).

## php.ini po PHP2Shell: kas pasikeitė

Beveik visos php.net pereinamosios priemonės nuo PHP2Shell yra INI nustatymai: `memory_limit=-1` užrakintas nuo perrašymo, ribota `post_max_size`, `session.upload_progress.enabled=0` ir PHP 8.5 `fatal_error_backtraces=0`. php.net pabrėžia, kad `session.upload_progress.enabled` nereikėtų nustatyti per `ini_set()` ar `.user.ini`, o php.ini, FPM baseine ar serverio konfigūracijoje, o po to iš naujo paleisti visus darbinius procesus. Pilnas sąrašas pateiktas skyriuje [Skubios priemonės, kai dar negalite pataisyti](https://phpsos.de/lt/php2shell/sofortmassnahmen-ohne-patch/).

Su ištaisytomis versijomis 8.5.12, 8.4.27, 8.3.36 ir 8.2.35, pasak vadovo, pasikeitė ir `memory_limit`: dabar tai minkštoji riba. Naujas nustatymas `memory_hard_limit_percent` nustato kietąją ribą. Be savos reikšmės ji yra dvigubai didesnė už `memory_limit`, o jei daugiau kaip `1G`, tai reikšmė plius `1G`. Ją viršijus, procesas iškart baigiasi su išėjimo būsena 137. Kaip prasmingai pasirinkti abi ribas, paaiškina [memory_limit teisingas nustatymas](https://phpsos.de/lt/blog/memory-limit-richtig-setzen/).

> **Patarimas:**
> Pasak vadovo, galioja: jei PHP versija `memory_hard_limit_percent` nepažįsta, ją veikia CVE-2026-109618 ir CVE-2026-109619. Distribucijose su backport būseną papildomai įrodo paketo pakeitimų žurnalas.

## Kaip PHP SOS padeda konkrečiai?

- **Veiksmingų reikšmių nustatymas:** kiekvienai SAPI nuskaitome, kurie failai įkeliami ir kuri reikšmė galiausiai galioja.
- **Lygių sutvarkymas:** pašaliname prieštaringus įrašus iš skydelių, baseinų, `.htaccess` ir `.user.ini`.
- **Užraktų nustatymas:** [serverio sutvirtinimo](https://phpsos.de/lt/leistungen/server-haertung/) rėmuose saugumui svarbias reikšmes nustatome per `php_admin_value`.
- **Įrodymas:** dokumentuojame nustatymus ir paleidimą iš naujo, kad būseną vėliau būtų galima pagrįsti.


## Dažni klausimai

**Kur yra php.ini?**  
Tai priklauso nuo operacinės sistemos, paketo ir SAPI. Debian ir Ubuntu kiekvienai versijai ir SAPI yra atskiri aplankai, pavyzdžiui, /etc/php/8.3/fpm/php.ini ir /etc/php/8.3/cli/php.ini. Komandinėje eilutėje php --ini rodo įkeltus failus, svetainei padeda php_ini_loaded_file() trumpam patalpintame patikros faile.

**Kokia tvarka skaitomi failai aplanke conf.d?**  
Pasak PHP vadovo, PHP skaito visus failus su plėtiniu .ini nuskaitymo kataloge abėcėlės tvarka. Vėlesni failai perrašo ankstesnių reikšmes. Todėl daugelio failų pavadinimuose yra skaičiai, tokie kaip 20- ar 99-.

**Kodėl mano php.ini pakeitimas neveikia?**  
Dažnos priežastys: pakeistas kitos SAPI failas, tarnyba nebuvo paleista iš naujo, reikšmę perrašo FPM baseino, Apache konfigūracijos ar .user.ini reikšmė, arba hostingo skydelis failą perrašo kitą kartą įrašant.

**Kas yra memory_hard_limit_percent?**  
Naujas nustatymas, kuris, pasak PHP vadovo, įvestas su saugumo leidimais 2026-10-21. Jis nustato kietąją atminties ribą kaip memory_limit procentą. Vadovas nurodo, kad PHP versija, kuri šio nustatymo nepažįsta, yra paveikta PHP2Shell spragų.

## Šaltiniai

- [PHP vadovas: konfigūracijos failas](https://www.php.net/manual/en/configuration.file.php)
- [PHP vadovas: INI keitimo režimai](https://www.php.net/manual/en/configuration.changes.modes.php)
- [PHP vadovas: .user.ini failai](https://www.php.net/manual/en/configuration.file.per-user.php)
- [PHP vadovas: pagrindiniai nustatymai](https://www.php.net/manual/en/ini.core.php)
