Īsi: php.ini ir PHP centrālais konfigurācijas fails. PHP to nolasa startējot, servera moduļiem vienreiz, CGI un CLI katrā izsaukumā. Klāt nāk papildu faili no skenēšanas direktorija, iestatījumi FPM pūlā vai Apache, .htaccess vai .user.ini un ini_set() kodā. Kurš līmenis vērtību drīkst mainīt, nosaka tās izmaiņu režīms, piemēram, INI_SYSTEM vai INI_PERDIR. Vērtības ar php_admin_value lietojumprogramma vairs nevar pārrakstīt.
Kas ir php.ini?
php.ini ir teksta fails ar ierakstiem pēc parauga name = wert. Tas nosaka, kā PHP uzvedas: cik daudz atmiņas skripts drīkst izmantot, vai kļūdas parādās pārlūkprogrammā, kā darbojas sesijas un kuri paplašinājumi tiek ielādēti. Komentāri sākas ar semikolu.
Saskaņā ar PHP rokasgrāmatu fails tiek nolasīts PHP startēšanas laikā. Servera moduļu, piemēram, mod_php, gadījumā tas notiek tikai vienreiz, startējot tīmekļa serveri, CGI un CLI katrā izsaukumā. PHP-FPM savu konfigurāciju nolasa startējot un pakalpojuma pārlādes laikā. Izmaiņa bez pārstartēšanas vai pārlādes tāpēc parasti nedarbojas.
Kopš PHP 8.3 saskaņā ar rokasgrāmatu ieraksts var atsaukties uz vides mainīgo ar aizstājējvērtību:
memory_limit = ${PHP_MEMORY_LIMIT}
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}
Kur PHP meklē php.ini?
Rokasgrāmata apraksta stingru secību. Vispirms spēkā ir skaidri norādīts ceļš, piemēram, PHPIniDir Apache vai opcija -c CGI un CLI gadījumā. Pretējā gadījumā PHP veido meklēšanas ceļu no:
- vides mainīgā
PHPRC, - sistēmā Windows reģistra ieraksta
IniFilePath, - pašreizējā darba direktorija, izņemot SAPI, kas to izslēdz, piemēram, CLI,
- PHP binārā faila vai moduļa direktorija,
- kompilēšanas laikā iestatītā ceļa
--with-config-file-path.
Šajā meklēšanas ceļā PHP vispirms meklē failu php-SAPI.ini, piemēram, php-cli.ini, un tikai pēc tam php.ini. Pēc tam PHP alfabētiskā secībā nolasa visus .ini failus no skenēšanas direktorija, kas noteikts ar PHP_INI_SCAN_DIR vai kompilēšanas laikā ar --with-config-file-scan-dir. Kuri faili ielādēti, rāda php --ini vai funkcija php_ini_scanned_files().
php --ini
php -r 'var_dump(php_ini_loaded_file(), php_ini_scanned_files());'
Abas komandas rāda komandrindas stāvokli. Vietnei var būt spēkā cits fails, jo katrai SAPI var būt sava konfigurācija; vairāk sadaļā SAPI izskaidrota.
Izmaiņu režīmi: kam kuru vērtību drīkst iestatīt?
Ne katru iestatījumu drīkst iestatīt visur. Rokasgrāmata katrai direktīvai piešķir izmaiņu režīmu:
| Režīms | Kur vērtību drīkst iestatīt |
|---|---|
INI_USER |
skriptos ar ini_set(), Windows reģistrā un failā .user.ini |
INI_PERDIR |
php.ini, .htaccess, httpd.conf vai .user.ini |
INI_SYSTEM |
tikai php.ini vai httpd.conf |
INI_ALL |
visur |
Piemēri no rokasgrāmatas: memory_limit ir režīms INI_ALL un noklusējums 128M, post_max_size ir INI_PERDIR un noklusējums 8M, upload_max_filesize ir INI_PERDIR un noklusējums 2M. expose_php drīkst atrasties tikai php.ini.
.user.ini faili saskaņā ar rokasgrāmatu tiek nolasīti tikai CGI un FastCGI SAPI, tātad arī PHP-FPM. PHP tos meklē no skripta direktorija uz augšu līdz Document Root un pēc noklusējuma nolasa no jauna ne biežāk kā ik pēc 300 sekundēm (user_ini.cache_ttl). Ar mod_php šo lomu pilda .htaccess.
Kura vērtība galu galā ir spēkā? Līmeņi pēc prioritātes
Vienkāršoti: jo vēlāk līmenis iedarbojas, jo lielāka iespēja, ka tā vērtība uzvar, ja izmaiņu režīms to atļauj.
- attiecīgās SAPI php.ini
- papildu faili no skenēšanas direktorija, alfabētiski
- servera konfigurācija: FPM pūls ar
php_valuevaiphp_admin_value, Apache VirtualHost - direktorija līmenis:
.htaccessar mod_php,.user.iniar FPM un CGI - izpildes laiks:
ini_set()lietojumprogrammas kodā
Izņēmums ir izšķirošs: vērtības ar php_admin_value vai php_admin_flag saskaņā ar rokasgrāmatu nevar pārrakstīt ar ini_set(). Tā administratori bloķē drošībai svarīgus iestatījumus pret lietojumprogrammu. Detalizēti tas aprakstīts sadaļā php_admin_value: iestatījumu bloķēšana pret pārrakstīšanu.
php.ini pēc PHP2Shell: kas ir mainījies
php.net pagaidu pasākumi pret PHP2Shell gandrīz visi ir INI iestatījumi: memory_limit=-1 iestatīts bloķēti pret pārrakstīšanu, ierobežots post_max_size, session.upload_progress.enabled=0 un PHP 8.5 fatal_error_backtraces=0. php.net uzsver, ka session.upload_progress.enabled nevajadzētu iestatīt ar ini_set() vai .user.ini, bet php.ini, FPM pūlā vai servera konfigurācijā, ar sekojošu visu darbprocesu pārstartēšanu. Pilns saraksts atrodas sadaļā Tūlītēji pasākumi, ja vēl nevarat ielāpot.
Ar labotajām versijām 8.5.12, 8.4.27, 8.3.36 un 8.2.35 saskaņā ar rokasgrāmatu mainījies arī memory_limit: tagad tā ir mīkstā robeža. Jaunais iestatījums memory_hard_limit_percent nosaka cieto robežu. Bez savas vērtības tā ir divkāršs memory_limit, ja vairāk par 1G, tad vērtība plus 1G. Ja tā tiek pārsniegta, process nekavējoties beidzas ar izejas statusu 137. Kā abas robežas izvēlēties saprātīgi, izskaidro memory_limit pareiza iestatīšana.
Saskaņā ar rokasgrāmatu ir spēkā: ja PHP versija memory_hard_limit_percent nepazīst, to skar CVE-2026-109618 un CVE-2026-109619. Distributīvos ar backport labojumiem stāvokli papildus pierāda pakotnes changelog.
Kā PHP SOS palīdz konkrēti?
- Noteikt spēkā esošās vērtības: Mēs katrai SAPI nolasām, kuri faili tiek ielādēti un kura vērtība galu galā ir spēkā.
- Sakopt līmeņus: Mēs noņemam pretrunīgus ierakstus no paneļiem, pūliem,
.htaccessun.user.ini. - Iestatīt bloķējumus: Servera nostiprināšanas ietvaros mēs drošībai svarīgas vērtības nofiksējam ar
php_admin_value. - Pierādīt: Mēs dokumentējam iestatījumus un pārstartēšanu, lai stāvokli vēlāk varētu pierādīt.
Biežāk uzdotie jautājumi
Kur atrodas php.ini?
Tas atkarīgs no operētājsistēmas, pakotnes un SAPI. Debian un Ubuntu katrai versijai un SAPI ir savas mapes, piemēram, /etc/php/8.3/fpm/php.ini un /etc/php/8.3/cli/php.ini. Komandrindā php --ini rāda ielādētos failus, vietnei palīdz php_ini_loaded_file() īslaicīgā pārbaudes failā.
Kādā secībā tiek nolasīti faili conf.d mapē?
Saskaņā ar PHP rokasgrāmatu PHP nolasa visus failus ar paplašinājumu .ini skenēšanas direktorijā alfabētiskā secībā. Vēlāki faili pārraksta agrāko vērtības. Tāpēc daudzu failu nosaukumos ir skaitļi, piemēram, 20- vai 99-.
Kāpēc manas php.ini izmaiņas nedarbojas?
Biežākie iemesli: mainīts citas SAPI fails, pakalpojums nav pārstartēts, vērtību pārraksta iestatījums FPM pūlā, Apache konfigurācijā vai failā .user.ini, vai arī hostinga panelis nākamajā saglabāšanā failu uzraksta no jauna.
Kas ir memory_hard_limit_percent?
Jauns iestatījums, kas saskaņā ar PHP rokasgrāmatu ieviests ar drošības izlaidumiem 2026. gada 21. oktobrī. Tas nosaka cieto atmiņas robežu kā memory_limit procentuālu daļu. Rokasgrāmata norāda, ka PHP versija, kas šo iestatījumu nepazīst, ir PHP2Shell ievainojamību skarta.