Kort sagt: php.ini är PHP:s centrala konfigurationsfil. PHP läser den vid start, med servermoduler en gång, med CGI och CLI vid varje anrop. Dessutom tillkommer tilläggsfiler från en skanningskatalog, inställningar i FPM-poolen eller i Apache, .htaccess respektive .user.ini och ini_set() i koden. Vilken nivå som får ändra ett värde avgör dess ändringsläge, till exempel INI_SYSTEM eller INI_PERDIR. Värden satta med php_admin_value kan applikationen inte längre skriva över.
Vad är php.ini?
php.ini är en textfil med poster enligt mönstret name = wert. Den avgör hur PHP beter sig: hur mycket minne ett skript får använda, om fel visas i webbläsaren, hur sessioner fungerar och vilka tillägg som laddas. Kommentarer inleds med semikolon.
Enligt PHP-manualen läses filen när PHP startar. Med servermoduler som mod_php sker det bara en gång, vid webbserverns start, med CGI och CLI vid varje anrop. PHP-FPM läser sin konfiguration vid start och när tjänsten laddas om. En ändring utan omstart eller omladdning verkar därför oftast inte.
Sedan PHP 8.3 kan en post enligt manualen hänvisa till en miljövariabel med reservvärde:
memory_limit = ${PHP_MEMORY_LIMIT}
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}
Var söker PHP efter php.ini?
Manualen beskriver en fast ordning. Först gäller en uttryckligen angiven sökväg, till exempel PHPIniDir i Apache eller alternativet -c vid CGI och CLI. Annars bygger PHP upp en sökväg av:
- miljövariabeln
PHPRC, - under Windows registerposten
IniFilePath, - den aktuella arbetskatalogen, utom för SAPI som stänger av det, till exempel CLI,
- katalogen för PHP-binärfilen respektive modulen,
- sökvägen
--with-config-file-pathsom sattes vid kompileringen.
I den här sökvägen letar PHP först efter en fil php-SAPI.ini, till exempel php-cli.ini, och först därefter efter php.ini. Därefter läser PHP alla .ini-filer i skanningskatalogen, som anges med PHP_INI_SCAN_DIR eller vid kompilering med --with-config-file-scan-dir, i alfabetisk ordning. Vilka filer som laddades visar php --ini eller funktionen php_ini_scanned_files().
php --ini
php -r 'var_dump(php_ini_loaded_file(), php_ini_scanned_files());'
Båda kommandona visar kommandoradens läge. För webbplatsen kan en annan fil gälla, eftersom varje SAPI kan ha sin egen konfiguration; mer om detta under SAPI förklarat.
Ändringslägen: vem får sätta vilket värde?
Inte varje inställning får sättas överallt. Manualen tilldelar varje direktiv ett ändringsläge:
| Läge | Var värdet får sättas |
|---|---|
INI_USER |
i skript med ini_set(), i Windows-registret och i .user.ini |
INI_PERDIR |
i php.ini, .htaccess, httpd.conf eller .user.ini |
INI_SYSTEM |
bara i php.ini eller httpd.conf |
INI_ALL |
överallt |
Exempel från manualen: memory_limit har läget INI_ALL och standardvärdet 128M, post_max_size har INI_PERDIR och standardvärdet 8M, upload_max_filesize har INI_PERDIR och standardvärdet 2M. expose_php får bara stå i php.ini.
.user.ini-filer läses enligt manualen bara av CGI- och FastCGI-SAPI, alltså även av PHP-FPM. PHP söker efter dem från skriptets katalog uppåt till document root och läser dem som standard om högst var 300:e sekund (user_ini.cache_ttl). Under mod_php tar .htaccess över den rollen.
Vilket värde gäller till sist? Nivåerna och företrädet
Förenklat gäller: Ju senare en nivå slår in, desto troligare är det att dess värde gäller, så länge ändringsläget tillåter det.
- php.ini för respektive SAPI
- Tilläggsfiler från skanningskatalogen, alfabetiskt
- Serverkonfiguration: FPM-pool med
php_valuerespektivephp_admin_value, Apache-VirtualHost - Katalognivå:
.htaccessvid mod_php,.user.inivid FPM och CGI - Körtid:
ini_set()i applikationskoden
Undantaget är avgörande: Värden satta med php_admin_value eller php_admin_flag kan enligt manualen inte skrivas över med ini_set(). Därmed låser administratörer säkerhetsrelevanta inställningar mot applikationen. Det beskrivs utförligt i php_admin_value: låsa inställningar mot överskrivning.
php.ini efter PHP2Shell: vad som har ändrats
Övergångsåtgärderna från php.net för PHP2Shell är nästan alla INI-inställningar: memory_limit=-1 låst mot överskrivning, begränsad post_max_size, session.upload_progress.enabled=0 och på PHP 8.5 fatal_error_backtraces=0. php.net betonar att session.upload_progress.enabled inte ska sättas via ini_set() eller .user.ini, utan i php.ini, FPM-poolen eller serverkonfigurationen, med efterföljande omstart av alla workers. Den fullständiga listan står under Omedelbara åtgärder när ni ännu inte kan patcha.
Med de rättade versionerna 8.5.12, 8.4.27, 8.3.36 och 8.2.35 har enligt manualen också memory_limit ändrats: Den är nu en mjuk gräns. Den nya inställningen memory_hard_limit_percent fastställer en hård gräns. Utan eget värde uppgår den till det dubbla av memory_limit, vid mer än 1G till värdet plus 1G. Överskrids den avslutas processen omedelbart med exit-status 137. Hur ni väljer båda gränserna rimligt förklaras i Sätta memory_limit rätt.
Enligt manualen gäller: Känner en PHP-version inte igen memory_hard_limit_percent berörs den av CVE-2026-109618 och CVE-2026-109619. För distributioner med backports styrker dessutom paketets changelog läget.
Hur hjälper PHP SOS konkret?
- Fastställa verksamma värden: Vi läser för varje SAPI ut vilka filer som laddas och vilket värde som till sist gäller.
- Städa nivåerna: Vi tar bort motstridiga poster från paneler, pooler,
.htaccessoch.user.ini. - Sätta lås: Inom ramen för serverhärdning fastställer vi säkerhetsrelevanta värden med
php_admin_value. - Styrka: Vi dokumenterar inställningar och omstart så att läget går att belägga i efterhand.
Vanliga frågor
Var ligger php.ini?
Det beror på operativsystem, paket och SAPI. Under Debian och Ubuntu finns egna mappar per version och SAPI, till exempel /etc/php/8.3/fpm/php.ini och /etc/php/8.3/cli/php.ini. På kommandoraden visar php --ini de laddade filerna, för webbplatsen hjälper php_ini_loaded_file() i en kortvarig kontrollfil.
I vilken ordning läses filerna i conf.d-mappen?
Enligt PHP-manualen läser PHP alla filer med ändelsen .ini i skanningskatalogen i alfabetisk ordning. Senare filer skriver över värden från tidigare. Därför har många filer tal som 20- eller 99- i namnet.
Varför verkar inte min ändring i php.ini?
Vanliga skäl: Filen för ett annat SAPI har ändrats, tjänsten har inte startats om, ett värde i FPM-poolen, i Apache-konfigurationen eller i en .user.ini skriver över det, eller en hostingpanel skriver om filen vid nästa sparning.
Vad är memory_hard_limit_percent?
En ny inställning som enligt PHP-manualen infördes med säkerhetsreleaserna den 21 oktober 2026. Den fastställer en hård minnesgräns som procentsats av memory_limit. Manualen påpekar att en PHP-version som inte känner till den här inställningen berörs av PHP2Shell-sårbarheterna.