# Composer: PHP:n pakettienhallinta

> Composer selitettynä: composer.json, composer.lock, vendor ja automaattinen lataaja, tuotantoon vienti oikein ja riippuvuuksien turvallinen ylläpito.

Lähde: https://phpsos.de/fi/php/composer/  
Tilanne: 25.10.2026  
Palveluntarjoaja: PHP SOS, PHP-hätäapu ja palvelimen tietoturva. Pikaapu WhatsAppilla: https://wa.me/491736494914?text=Hei%20PHP%20SOS%2C%20tarvitsemme%20apua%20PHP-palvelimemme%20kanssa.%20Yritys%3A%20%E2%80%A6%20Verkkosivusto%3A%20%E2%80%A6

**Lyhyesti:** Composer on PHP:n pakettienhallinta. Se lukee tiedostosta `composer.json`, mitä kirjastoja projekti tarvitsee, lataa ne kansioon `vendor`, tallentaa tarkat versiot tiedostoon `composer.lock` ja luo automaattisen lataajan, joka löytää luokat itse. Composer hallinnoi siis sovelluksenne koodia, ei PHP-tulkkia: Composer-päivitys ei sulje PHP:n aukkoa kuten PHP2Shell.

## Mikä Composer on ja mihin sitä tarvitaan?

Tuskin mikään PHP-sovellus koostuu nykyään pelkästä omasta koodista. Kehykset, sähköpostikirjastot, PDF-tuotanto tai maksuyhteydet tulevat valmiina paketteina. Composer, PHP:n pakettienhallinta, huolehtii siitä, että nämä paketit yhdistyvät sopivissa versioissa ja että jokainen riippuvuus tuo mukanaan omat riippuvuutensa.

Päättäjälle tämä tarkoittaa: suuri osa palvelimellanne toimivasta koodista tulee kolmansilta osapuolilta. Se on tehokasta, mutta vaatii huoltoa. Ylläpitäjille ja kehittäjille tämä tarkoittaa: Composeria oikein käyttävä voi milloin tahansa jäljittää, mikä kirjaston versio tuotannossa pyörii.

Pakettien vakiolähde on Composerin dokumentaation mukaan Packagist.org. Muita lähteitä, esimerkiksi verkkotoimiston sisäisiä repositorioita, voi lisätä `composer.json`-tiedostoon kohdassa `repositories`.

## composer.json, composer.lock ja vendor: kolme perusosaa

Composer toimii kolmen asian varassa, jotka kannattaa tuntea ennen kuin ottaa palvelimen haltuunsa tai tilaa toimiston.

| Osa | Sisältö | Kuuluuko repositorioon? |
|---|---|---|
| `composer.json` | halutut paketit versioväleineen (`require`, `require-dev`), automaattisen latauksen säännöt, asetukset | kyllä |
| `composer.lock` | kaikkien pakettien tarkasti ratkaistut versiot, myös välilliset | kyllä, Composerin dokumentaation mukaan nimenomaan |
| `vendor/` | pakettien ladattu koodi ja luotu automaattinen lataaja | ei, syntyy asennuksessa |

Kohdassa `require` ovat paketit, joita sovellus tarvitsee käytössä. Kohdassa `require-dev` ovat kehityksen ja testauksen työkalut, esimerkiksi testikehykset tai staattinen analyysi. Tämä erottelu on tärkeä, koska kehitystyökaluilla ei ole mitään asiaa tuotantopalvelimelle.

```json
{
    "require": {
        "php": ">=8.3",
        "monolog/monolog": "^3.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^11.0"
    },
    "autoload": {
        "psr-4": { "App\\": "src/" }
    }
}
```

Esimerkin versiotiedot on valittu vain havainnollistamiseksi. Mitä versioita projektinne tarvitsee, riippuu sen vaatimuksista.

## install vai update: ero käytössä

Kaksi komentoa kuulostavat samanlaisilta, mutta niiden seuraukset ovat hyvin erilaiset.

- `composer install` lukee tiedoston `composer.lock` ja asentaa täsmälleen siihen tallennetut versiot. Se on toistettavaa ja kuuluu toimitukseen.
- `composer update` ratkaisee kaikki riippuvuudet uudelleen, hakee uusimmat sopivat versiot ja kirjoittaa `composer.lock`-tiedoston uudelleen. Se kuuluu kehitykseen, ja sen jälkeen ajetaan testit.

Composerin dokumentaation mukaan `update` suorittaa lukitustiedoston kirjoittamisen jälkeen lisäksi tietoturvatarkistuksen (audit), ellei sitä sammuteta valinnalla `--no-audit`. `install` ei tarkista oletuksena; sitä varten on valinta `--audit`.

## Automaattinen lataus: miten Composer löytää luokat

Composer luo tiedoston `vendor/autoload.php`. Kun se on kerran liitetty mukaan, PHP lataa jokaisen luokan vasta kun sitä tarvitaan. Omalle koodille kohdassa `autoload` määritetään, mikä nimiavaruus sijaitsee missäkin kansiossa. Suositus on PSR-4, PHP-FIG:n standardi. Miten se tarkalleen toimii, selittää sivu [Nimiavaruudet ja automaattinen lataus](https://phpsos.de/fi/php/namespaces-autoloading/); yleiskatsauksen kaikista standardeista antaa sivu [PSR-standardit](https://phpsos.de/fi/php/psr-standards/).

```php
<?php
require __DIR__ . '/../vendor/autoload.php';

$log = new Monolog\Logger('app');   // ladataan tarvittaessa automaattisesti
```

## Composer tuotannossa: toimitus siististi

Toimitukseen on vakiintunut kiinteä järjestys. Se ajetaan parhaiten build-putkessa eikä käsin palvelimella.

1. **Lukitustiedoston tarkistus:** `composer validate` varmistaa, että `composer.json` on kelvollinen ja `composer.lock` ajan tasalla.
2. **Asennus ilman kehityspaketteja:** `composer install --no-dev` jättää `require-dev`-paketit pois.
3. **Automaattisen lataajan optimointi:** `--optimize-autoloader` (lyhyesti `-o`) muuntaa säännöt luokkaluetteloksi. Valinnalla `--classmap-authoritative` PHP lataa luokat yksinomaan tästä luettelosta.
4. **Tietoturvatarkistus:** `composer audit --locked` tarkistaa lukitustiedoston versiot tunnettuja tietoturvailmoituksia vasten ja ilmoittaa hylätyistä paketeista.
5. **vendor verkkojuuren ulkopuolella:** Vain julkisen kansion, jossa on sisääntulokomentosarja, tulee olla tavoitettavissa URL:n kautta.

```bash
composer validate
composer install --no-dev --optimize-autoloader
composer audit --locked --no-dev
```

`composer outdated` näyttää lisäksi, millä asennetuilla paketeilla on uudempia versioita. Se on perusta suunnitelluille päivityksille kiireisten yksittäistoimien sijaan.

## Composer, tietoturva ja PHP2Shell

Composer ja PHP2Shell koskevat kahta eri tasoa. Haavoittuvuudet CVE-2026-109618 ja CVE-2026-109619 ovat itse PHP-tulkissa. Ne on korjattu versioissa PHP 8.5.12, 8.4.27, 8.3.36 ja 8.2.35, ja kaikki PHP-prosessit on sen jälkeen käynnistettävä uudelleen. Mikään `composer update` eikä mikään paketti kansiossa `vendor` muuta tätä.

Silti Composer kuuluu jokaiseen poikkeaman jälkeiseen tarkistukseen. Joka tuo haittakoodin palvelimelle, voi muuttaa myös kansion `vendor` tiedostoja, ja `vendor/autoload.php` ladataan jokaisella pyynnöllä. Tuore `composer install` tarkistetusta lukitustiedostosta tyhjään hakemistoon on siksi hyvä tapa palauttaa pakettikanta. Miten riippuvuudet tarkistetaan säännöllisesti tunnettujen aukkojen varalta, kuvaa opas [composer audit](https://phpsos.de/fi/ratgeber/composer-abhaengigkeiten-pruefen/).

> **Tärkeää:**
> Vihreä `composer audit` ei kerro mitään PHP:n korjaustasosta. Tarkistakaa PHP-ajoympäristö erikseen, esimerkiksi [PHP-päivityspalvelumme](https://phpsos.de/fi/leistungen/php-patch-service/) avulla.

## Miten PHP SOS auttaa konkreettisesti?

- Kartoitamme jokaisesta sovelluksesta PHP-version, Composer-paketit ja lukitustilan ja erotamme siististi tulkin ja kirjastot toisistaan.
- Tarkistamme, sopivatko `vendor` ja lukitustiedosto yhteen ja onko tuotannossa kehityspaketteja tai muutettuja tiedostoja.
- Otamme käyttöön toistettavan toimituksen komennolla `install --no-dev`, optimoidulla automaattisella lataajalla ja auditilla.
- Poikkeaman jälkeen palautamme pakettikannan tarkistetusta lukitustiedostosta ja dokumentoimme tuloksen.


## Usein kysytyt kysymykset

**Pitääkö composer.lock viedä Git-repositorioon?**  
Kyllä. Composerin dokumentaatio suosittelee nimenomaan composer.lock-tiedoston commitointia. Vain siten kehitys, CI ja tuotanto asentavat täsmälleen samat pakettiversiot.

**Mikä ero on komennoilla composer install ja composer update?**  
install asentaa versiot, jotka on tallennettu composer.lock-tiedostoon. update ratkaisee riippuvuudet uudelleen, hakee sopivat uudemmat versiot ja kirjoittaa composer.lockin uudelleen. Tuotantopalvelimelle kuuluu vain install.

**Sulkeeko Composer-päivitys PHP2Shell-aukon?**  
Ei. Composer hallinnoi sovelluksenne kirjastoja, ei PHP-tulkkia. PHP2Shell suljetaan vain päivittämällä PHP-ajoympäristö korjattuun versioon ja käynnistämällä kaikki PHP-prosessit uudelleen.

**Missä vendor-kansion pitäisi sijaita?**  
Ihannetapauksessa julkisesti tavoitettavan verkkohakemiston ulkopuolella. Monet kehykset sijoittavat verkkojuureen vain public-kansion, kun taas vendor on yhtä tasoa ylempänä.

## Lähteet

- [Composer: perustyönkulku (Basic usage)](https://getcomposer.org/doc/01-basic-usage.md)
- [Composer: komentorivi (Command-line interface)](https://getcomposer.org/doc/03-cli.md)
- [Composer: composer.json-skeema (The composer.json schema)](https://getcomposer.org/doc/04-schema.md)
