# php.ini explicat: structură, niveluri și prioritate

> php.ini explicat: unde își caută PHP configurația, ce niveluri există, ce înseamnă INI_SYSTEM și INI_PERDIR și ce valoare se aplică în final.

Sursa: https://phpsos.de/ro/php/php-ini-erklaert/  
Stadiu: 25.10.2026  
Furnizor: PHP SOS, Asistență de urgență PHP și securitatea serverelor. Ajutor imediat pe WhatsApp: https://wa.me/491736494914?text=Bun%C4%83%20ziua%2C%20PHP%20SOS%2C%20avem%20nevoie%20de%20ajutor%20cu%20serverul%20nostru%20PHP.%20Firma%3A%20%E2%80%A6%20Site%3A%20%E2%80%A6

**Pe scurt:** php.ini este fișierul central de configurare al PHP. PHP îl citește la pornire, la modulele de server o singură dată, la CGI și CLI la fiecare apel. La aceasta se adaugă fișiere suplimentare dintr-un director de scanare, setări în pool-ul FPM sau în Apache, `.htaccess` respectiv `.user.ini` și `ini_set()` în cod. Ce nivel poate modifica o valoare stabilește modul ei de modificare, de exemplu `INI_SYSTEM` sau `INI_PERDIR`. Valorile setate prin `php_admin_value` nu mai pot fi suprascrise de aplicație.

## Ce este php.ini?

php.ini este un fișier text cu intrări după modelul `name = wert`. El stabilește cum se comportă PHP: câtă memorie poate folosi un script, dacă erorile apar în browser, cum lucrează sesiunile și ce extensii se încarcă. Comentariile încep cu punct și virgulă.

Potrivit manualului PHP, fișierul este citit la pornirea PHP. La modulele de server precum mod_php, aceasta se întâmplă o singură dată, la pornirea serverului web, la CGI și CLI la fiecare apel. PHP-FPM își citește configurația la pornire și la reîncărcarea serviciului. O modificare fără repornire sau reload nu are de aceea, de obicei, efect.

Din PHP 8.3, potrivit manualului, o intrare poate trimite la o variabilă de mediu cu valoare de rezervă:

```ini
memory_limit = ${PHP_MEMORY_LIMIT}
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}
```

## Unde caută PHP fișierul php.ini?

Manualul descrie o ordine fixă. Mai întâi se aplică o cale setată explicit, de exemplu `PHPIniDir` în Apache sau opțiunea `-c` la CGI și CLI. Altfel, PHP construiește o cale de căutare din:

1. variabila de mediu `PHPRC`,
2. sub Windows, intrarea de registru `IniFilePath`,
3. directorul de lucru curent, cu excepția SAPI-urilor care dezactivează asta, de exemplu CLI,
4. directorul fișierului binar PHP, respectiv al modulului,
5. calea setată la compilare `--with-config-file-path`.

În această cale de căutare, PHP caută mai întâi un fișier `php-SAPI.ini`, de exemplu `php-cli.ini`, și abia apoi `php.ini`. Apoi PHP citește în ordine alfabetică toate fișierele `.ini` din directorul de scanare, stabilit prin `PHP_INI_SCAN_DIR` sau, la compilare, prin `--with-config-file-scan-dir`. Ce fișiere au fost încărcate arată `php --ini` sau funcția `php_ini_scanned_files()`.

```bash
php --ini
php -r 'var_dump(php_ini_loaded_file(), php_ini_scanned_files());'
```

Ambele comenzi arată starea din linia de comandă. Pentru site se poate aplica alt fișier, pentru că fiecare SAPI poate avea propria configurație; mai multe la [SAPI explicat](https://phpsos.de/ro/php/sapi-erklaert/).

## Moduri de modificare: cine poate seta ce valoare?

Nu orice setare poate fi făcută oriunde. Manualul atribuie fiecărei directive un mod de modificare:

| Mod | Unde poate fi setată valoarea |
|---|---|
| `INI_USER` | în scripturi prin `ini_set()`, în registrul Windows și în `.user.ini` |
| `INI_PERDIR` | în php.ini, `.htaccess`, `httpd.conf` sau `.user.ini` |
| `INI_SYSTEM` | doar în php.ini sau `httpd.conf` |
| `INI_ALL` | oriunde |

Exemple din manual: `memory_limit` are modul `INI_ALL` și valoarea implicită `128M`, `post_max_size` are `INI_PERDIR` și valoarea implicită `8M`, `upload_max_filesize` are `INI_PERDIR` și valoarea implicită `2M`. `expose_php` poate fi doar în php.ini.

Fișierele `.user.ini` sunt citite, potrivit manualului, doar de SAPI-urile CGI și FastCGI, deci și de PHP-FPM. PHP le caută de la directorul scriptului în sus până la document root și le citește implicit din nou cel mult la fiecare 300 de secunde (`user_ini.cache_ttl`). Sub mod_php, `.htaccess` preia acest rol.

## Ce valoare se aplică în final? Nivelurile în ordinea priorității

Simplificat: cu cât un nivel intervine mai târziu, cu atât valoarea lui se impune mai ușor, dacă modul de modificare o permite.

1. **php.ini** al SAPI-ului respectiv
2. **Fișiere suplimentare** din directorul de scanare, în ordine alfabetică
3. **Configurația serverului:** pool-ul FPM cu `php_value` respectiv `php_admin_value`, VirtualHost Apache
4. **Nivelul directorului:** `.htaccess` la mod_php, `.user.ini` la FPM și CGI
5. **Timpul de execuție:** `ini_set()` în codul aplicației

Excepția este decisivă: valorile setate prin `php_admin_value` sau `php_admin_flag` nu pot fi suprascrise, potrivit manualului, prin `ini_set()`. Astfel, administratorii blochează împotriva aplicației setările relevante pentru securitate. Este descris pe larg la [php_admin_value: blocarea setărilor împotriva suprascrierii](https://phpsos.de/ro/blog/php-admin-value-sperren/).

## php.ini după PHP2Shell: ce s-a schimbat

Măsurile provizorii de la php.net pentru PHP2Shell sunt aproape toate setări INI: `memory_limit=-1` blocat împotriva suprascrierii, un `post_max_size` limitat, `session.upload_progress.enabled=0` și, la PHP 8.5, `fatal_error_backtraces=0`. php.net subliniază că `session.upload_progress.enabled` nu trebuie setat prin `ini_set()` sau `.user.ini`, ci în php.ini, în pool-ul FPM sau în configurația serverului, cu repornirea ulterioară a tuturor workerilor. Lista completă se află la [Măsuri imediate dacă nu puteți încă aplica patch-ul](https://phpsos.de/ro/php2shell/sofortmassnahmen-ohne-patch/).

Cu versiunile corectate 8.5.12, 8.4.27, 8.3.36 și 8.2.35, potrivit manualului s-a schimbat și `memory_limit`: este acum o limită flexibilă. Noua setare `memory_hard_limit_percent` stabilește o limită fermă. Fără valoare proprie, ea este dublul lui `memory_limit`, iar la peste `1G` valoarea plus `1G`. Dacă este depășită, procesul se încheie imediat cu statusul de ieșire 137. Cum alegeți rezonabil ambele limite explică [Setarea corectă a memory_limit](https://phpsos.de/ro/blog/memory-limit-richtig-setzen/).

> **Sfat:**
> Potrivit manualului: dacă o versiune PHP nu recunoaște `memory_hard_limit_percent`, este afectată de CVE-2026-109618 și CVE-2026-109619. La distribuțiile cu backporturi, changelogul pachetului dovedește în plus starea.

## Cum ajută PHP SOS concret?

- **Stabilirea valorilor efective:** Citim pentru fiecare SAPI ce fișiere sunt încărcate și ce valoare se aplică în final.
- **Curățarea nivelurilor:** Eliminăm intrările contradictorii din panouri, pool-uri, `.htaccess` și `.user.ini`.
- **Setarea blocărilor:** În cadrul [întăririi serverului](https://phpsos.de/ro/leistungen/server-haertung/) fixăm valorile relevante pentru securitate prin `php_admin_value`.
- **Dovedirea:** Documentăm setările și repornirea, pentru ca starea să poată fi dovedită ulterior.


## Întrebări frecvente

**Unde se află php.ini?**  
Depinde de sistemul de operare, de pachet și de SAPI. Pe Debian și Ubuntu există directoare separate pentru fiecare versiune și SAPI, de exemplu /etc/php/8.3/fpm/php.ini și /etc/php/8.3/cli/php.ini. În linia de comandă, php --ini arată fișierele încărcate, iar pentru site ajută php_ini_loaded_file() într-un fișier de verificare temporar.

**În ce ordine sunt citite fișierele din directorul conf.d?**  
Potrivit manualului PHP, PHP citește în ordine alfabetică toate fișierele cu extensia .ini din directorul de scanare. Fișierele ulterioare suprascriu valorile celor anterioare. De aceea, multe fișiere au în nume numere precum 20- sau 99-.

**De ce nu are efect modificarea mea din php.ini?**  
Motive frecvente: a fost modificat fișierul altui SAPI, serviciul nu a fost repornit, o valoare din pool-ul FPM, din configurația Apache sau dintr-un .user.ini o suprascrie, sau un panou de hosting rescrie fișierul la următoarea salvare.

**Ce este memory_hard_limit_percent?**  
O setare nouă, introdusă potrivit manualului PHP cu lansările de securitate din 21.10.2026. Ea stabilește o limită fermă de memorie ca procent din memory_limit. Manualul atrage atenția că o versiune PHP care nu cunoaște această setare este afectată de vulnerabilitățile PHP2Shell.

## Surse

- [Manualul PHP: fișierul de configurare](https://www.php.net/manual/en/configuration.file.php)
- [Manualul PHP: modurile de modificare INI](https://www.php.net/manual/en/configuration.changes.modes.php)
- [Manualul PHP: fișierele .user.ini](https://www.php.net/manual/en/configuration.file.per-user.php)
- [Manualul PHP: setările de bază](https://www.php.net/manual/en/ini.core.php)
