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.
{
"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 installlukee tiedostoncomposer.lockja asentaa täsmälleen siihen tallennetut versiot. Se on toistettavaa ja kuuluu toimitukseen.composer updateratkaisee kaikki riippuvuudet uudelleen, hakee uusimmat sopivat versiot ja kirjoittaacomposer.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; yleiskatsauksen kaikista standardeista antaa sivu PSR-standardit.
<?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.
- Lukitustiedoston tarkistus:
composer validatevarmistaa, ettäcomposer.jsonon kelvollinen jacomposer.lockajan tasalla. - Asennus ilman kehityspaketteja:
composer install --no-devjättäärequire-dev-paketit pois. - Automaattisen lataajan optimointi:
--optimize-autoloader(lyhyesti-o) muuntaa säännöt luokkaluetteloksi. Valinnalla--classmap-authoritativePHP lataa luokat yksinomaan tästä luettelosta. - Tietoturvatarkistus:
composer audit --lockedtarkistaa lukitustiedoston versiot tunnettuja tietoturvailmoituksia vasten ja ilmoittaa hylätyistä paketeista. - vendor verkkojuuren ulkopuolella: Vain julkisen kansion, jossa on sisääntulokomentosarja, tulee olla tavoitettavissa URL:n kautta.
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.
Vihreä composer audit ei kerro mitään PHP:n korjaustasosta. Tarkistakaa PHP-ajoympäristö erikseen, esimerkiksi PHP-päivityspalvelumme avulla.
Miten PHP SOS auttaa konkreettisesti?
- Kartoitamme jokaisesta sovelluksesta PHP-version, Composer-paketit ja lukitustilan ja erotamme siististi tulkin ja kirjastot toisistaan.
- Tarkistamme, sopivatko
vendorja 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ä.