# Composer: pakkestyringen til PHP

> Composer forklaret: forstå composer.json, composer.lock, vendor og autoloader, lever rent til produktion og vedligehold afhængigheder sikkert.

Kilde: https://phpsos.de/da/php/composer/  
Status: 25.10.2026  
Udbyder: PHP SOS, PHP-nødhjælp og serversikkerhed. Akut hjælp på WhatsApp: https://wa.me/491736494914?text=Hej%20PHP%20SOS%2C%20vi%20har%20brug%20for%20hj%C3%A6lp%20med%20vores%20PHP-server.%20Firma%3A%20%E2%80%A6%20Website%3A%20%E2%80%A6

**Kort sagt:** Composer er pakkestyringen til PHP. Den læser i filen `composer.json`, hvilke biblioteker et projekt har brug for, henter dem ind i mappen `vendor`, fastholder de nøjagtige versioner i `composer.lock` og genererer en autoloader, der finder klasser automatisk. Composer administrerer dermed jeres applikations kode, ikke selve PHP-fortolkeren: En Composer-opdatering lukker ingen sårbarhed i PHP som PHP2Shell.

## Hvad er Composer, og hvad bruger man det til?

Næppe nogen PHP-applikation består i dag kun af egen kode. Frameworks, mail-biblioteker, PDF-generering eller betalingsintegrationer kommer til som færdige pakker. Composer, pakkestyringen til PHP, sørger for, at disse pakker kommer sammen i passende versioner, og at hver afhængighed medbringer sine egne afhængigheder.

For beslutningstagere betyder det: En stor del af den kode, der kører på jeres server, stammer fra tredjepart. Det er effektivt, men kræver vedligeholdelse. For administratorer og udviklere betyder det: Den, der bruger Composer rent, kan til enhver tid spore, hvilken version af hvilket bibliotek der kører i produktion.

Standardkilden til pakker er ifølge Composer-dokumentationen Packagist.org. Yderligere kilder, f.eks. et bureaus interne repositories, kan indføres i `composer.json` under `repositories`.

## composer.json, composer.lock og vendor: de tre byggesten

Composer arbejder med tre ting, som man bør kende, før man overtager en server eller beder et bureau om en opgave.

| Byggesten | Indhold | Hører i repositoriet? |
|---|---|---|
| `composer.json` | ønskede pakker med versionsintervaller (`require`, `require-dev`), autoload-regler, indstillinger | ja |
| `composer.lock` | nøjagtigt opløste versioner af alle pakker, også de indirekte | ja, ifølge Composer-dokumentationen udtrykkeligt |
| `vendor/` | pakkernes downloadede kode og den genererede autoloader | nej, oprettes ved installationen |

Under `require` står pakker, som applikationen har brug for i drift. Under `require-dev` står værktøjer til udvikling og test, f.eks. testframeworks eller statisk analyse. Denne adskillelse er vigtig, fordi udviklingsværktøjer intet har at gøre på en produktionsserver.

```json
{
    "require": {
        "php": ">=8.3",
        "monolog/monolog": "^3.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^11.0"
    },
    "autoload": {
        "psr-4": { "App\\": "src/" }
    }
}
```

Versionsangivelserne i eksemplet er kun valgt til illustration. Hvilke versioner jeres projekt har brug for, fremgår af dets krav.

## install eller update: forskellen i drift

De to kommandoer lyder ens, men har meget forskellige følger.

- `composer install` læser `composer.lock` og installerer præcis de dér fastholdte versioner. Det er reproducerbart og hører hjemme i leverancen.
- `composer update` løser alle afhængigheder på ny, henter de nyeste passende versioner og skriver `composer.lock` om. Det hører hjemme i udviklingen, med efterfølgende tests.

Ifølge Composer-dokumentationen udfører `update` efter skrivningen af lock-filen desuden en sikkerhedskontrol (audit), medmindre den slås fra med `--no-audit`. `install` kontrollerer ikke som standard; til det findes indstillingen `--audit`.

## Autoloading: hvordan Composer finder klasser

Composer genererer filen `vendor/autoload.php`. Bliver den inkluderet én gang, indlæser PHP hver klasse først, når den bruges. For egen kode fastlægges i afsnittet `autoload`, hvilket namespace der ligger i hvilken mappe. Anbefalet er hertil PSR-4, en standard fra PHP-FIG. Hvordan det præcist fungerer, forklarer siden [Namespaces og autoloading](https://phpsos.de/da/php/namespaces-autoloading/); et overblik over alle standarder giver siden [PSR-standarder](https://phpsos.de/da/php/psr-standards/).

```php
<?php
require __DIR__ . '/../vendor/autoload.php';

$log = new Monolog\Logger('app');   // indlæses automatisk ved behov
```

## Composer i produktion: lever rent

Til leveringen har en fast rækkefølge vist sig at fungere. Den kører bedst i en build-pipeline og ikke i hånden på serveren.

1. **Kontrollere lock-filen:** `composer validate` sikrer, at `composer.json` er gyldig, og at `composer.lock` er aktuel.
2. **Installere uden udviklingspakker:** `composer install --no-dev` udelader `require-dev`.
3. **Optimere autoloaderen:** `--optimize-autoloader` (kort `-o`) omdanner reglerne til en klasseliste. Med `--classmap-authoritative` indlæser PHP udelukkende klasser fra denne liste.
4. **Sikkerhedskontrol:** `composer audit --locked` kontrollerer versionerne fra lock-filen mod kendte sikkerhedsmeddelelser og melder opgivne pakker.
5. **vendor uden for webroot:** Kun den offentlige mappe med indgangsscriptet bør kunne nås via URL.

```bash
composer validate
composer install --no-dev --optimize-autoloader
composer audit --locked --no-dev
```

`composer outdated` viser desuden, hvilke installerede pakker der har nyere versioner. Det er grundlaget for planlagte opdateringer i stedet for hektiske enkeltaktioner.

## Composer, sikkerhed og PHP2Shell

Composer og PHP2Shell angår to forskellige niveauer. Sårbarhederne CVE-2026-109618 og CVE-2026-109619 ligger i selve PHP-fortolkeren. De er rettet i PHP 8.5.12, 8.4.27, 8.3.36 og 8.2.35, og alle PHP-processer skal derefter genstartes. Ingen `composer update` og ingen pakke i `vendor` ændrer noget herved.

Alligevel hører Composer med i enhver undersøgelse efter en hændelse. Den, der bringer skadelig kode på en server, kan også ændre filer i `vendor`, og `vendor/autoload.php` indlæses ved hver forespørgsel. En ny `composer install` fra den kontrollerede lock-fil i en tom mappe er derfor en god metode til at genskabe pakkebeholdningen. Hvordan I regelmæssigt kontrollerer afhængigheder for kendte sårbarheder, beskriver guiden [composer audit](https://phpsos.de/da/ratgeber/composer-abhaengigkeiten-pruefen/).

> **Vigtigt:**
> Et grønt `composer audit` siger intet om PHP's patch-status. Kontrollér PHP-runtime separat, f.eks. med vores [PHP-patchservice](https://phpsos.de/da/leistungen/php-patch-service/).

## Hvordan hjælper PHP SOS konkret?

- Vi registrerer for hver applikation PHP-version, Composer-pakker og lock-status og skelner herved rent mellem fortolker og biblioteker.
- Vi kontrollerer, om `vendor` og lock-filen passer til hinanden, og om udviklingspakker eller ændrede filer ligger i produktion.
- Vi indfører en reproducerbar levering med `install --no-dev`, optimeret autoloader og audit.
- Efter en hændelse genskaber vi pakkebeholdningen fra den kontrollerede lock-fil og dokumenterer resultatet.


## Ofte stillede spørgsmål

**Skal composer.lock i Git-repositoriet?**  
Ja. Composer-dokumentationen anbefaler udtrykkeligt at committe composer.lock. Kun sådan installerer udvikling, CI og produktion nøjagtigt de samme pakkeversioner.

**Hvad er forskellen på composer install og composer update?**  
install installerer de versioner, der er fastholdt i composer.lock. update løser afhængighederne på ny, henter passende nyere versioner og skriver composer.lock om. På produktionsserveren hører kun install hjemme.

**Lukker en Composer-opdatering PHP2Shell-sårbarheden?**  
Nej. Composer administrerer jeres applikations biblioteker, ikke PHP-fortolkeren. PHP2Shell lukkes kun ved en opdatering af PHP-runtime til en rettet version og genstart af alle PHP-processer.

**Hvor bør vendor-mappen ligge?**  
Ideelt uden for den offentligt tilgængelige webmappe. Mange frameworks lægger kun en public-mappe i webroot, mens vendor ligger ét niveau over.

## Kilder

- [Composer: Grundlæggende brug](https://getcomposer.org/doc/01-basic-usage.md)
- [Composer: Kommandolinjegrænsefladen](https://getcomposer.org/doc/03-cli.md)
- [Composer: Skemaet for composer.json](https://getcomposer.org/doc/04-schema.md)
