# php.ini förklarad: uppbyggnad, nivåer och företräde

> php.ini förklarad: var PHP söker sin konfiguration, vilka nivåer som finns, vad INI_SYSTEM och INI_PERDIR betyder och vilket värde som till sist gäller.

Källa: https://phpsos.de/sv/php/php-ini-erklaert/  
Aktualitet: 2026-10-25  
Leverantör: PHP SOS, PHP-nödhjälp och serversäkerhet. Omedelbar hjälp via WhatsApp: https://wa.me/491736494914?text=Hej%20PHP%20SOS%2C%20vi%20beh%C3%B6ver%20hj%C3%A4lp%20med%20v%C3%A5r%20PHP-server.%20F%C3%B6retag%3A%20%E2%80%A6%20Webbplats%3A%20%E2%80%A6

**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:

```ini
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:

1. miljövariabeln `PHPRC`,
2. under Windows registerposten `IniFilePath`,
3. den aktuella arbetskatalogen, utom för SAPI som stänger av det, till exempel CLI,
4. katalogen för PHP-binärfilen respektive modulen,
5. sökvägen `--with-config-file-path` som 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()`.

```bash
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](https://phpsos.de/sv/php/sapi-erklaert/).

## Ä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.

1. **php.ini** för respektive SAPI
2. **Tilläggsfiler** från skanningskatalogen, alfabetiskt
3. **Serverkonfiguration:** FPM-pool med `php_value` respektive `php_admin_value`, Apache-VirtualHost
4. **Katalognivå:** `.htaccess` vid mod_php, `.user.ini` vid FPM och CGI
5. **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](https://phpsos.de/sv/blog/php-admin-value-sperren/).

## 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](https://phpsos.de/sv/php2shell/sofortmassnahmen-ohne-patch/).

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](https://phpsos.de/sv/blog/memory-limit-richtig-setzen/).

> **Tips:**
> 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, `.htaccess` och `.user.ini`.
- **Sätta lås:** Inom ramen för [serverhärdning](https://phpsos.de/sv/leistungen/server-haertung/) 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.

## Källor

- [PHP-manualen: konfigurationsfilen](https://www.php.net/manual/en/configuration.file.php)
- [PHP-manualen: INI-ändringslägen](https://www.php.net/manual/en/configuration.changes.modes.php)
- [PHP-manualen: .user.ini-filer](https://www.php.net/manual/en/configuration.file.per-user.php)
- [PHP-manualen: kärninställningar](https://www.php.net/manual/en/ini.core.php)
