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ă:
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:
- variabila de mediu
PHPRC, - sub Windows, intrarea de registru
IniFilePath, - directorul de lucru curent, cu excepția SAPI-urilor care dezactivează asta, de exemplu CLI,
- directorul fișierului binar PHP, respectiv al modulului,
- 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().
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.
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.
- php.ini al SAPI-ului respectiv
- Fișiere suplimentare din directorul de scanare, în ordine alfabetică
- Configurația serverului: pool-ul FPM cu
php_valuerespectivphp_admin_value, VirtualHost Apache - Nivelul directorului:
.htaccessla mod_php,.user.inila FPM și CGI - 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.
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.
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.
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 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.