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:
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š:
- aplinkos kintamojo
PHPRC, - sistemoje Windows registro įrašo
IniFilePath, - dabartinio darbo katalogo, išskyrus SAPI, kurios tai išjungia, pavyzdžiui, CLI,
- PHP dvejetainio failo arba modulio katalogo,
- 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().
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.
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.
- atitinkamos SAPI php.ini
- papildomi failai iš nuskaitymo katalogo, abėcėlės tvarka
- serverio konfigūracija: FPM baseinas su
php_valuearbaphp_admin_value, Apache VirtualHost - katalogo lygis:
.htaccessesant mod_php,.user.iniesant FPM ir CGI - 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.
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.
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.
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ų,
.htaccessir.user.ini. - Užraktų nustatymas: serverio sutvirtinimo 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ų.