Na kratko: Composer je upravljalnik paketov za PHP. Iz datoteke composer.json prebere, katere knjižnice projekt potrebuje, jih prenese v mapo vendor, natančne različice zabeleži v composer.lock in ustvari samodejni nalagalnik (autoloader), ki razrede najde sam. Composer tako upravlja kodo vaše aplikacije, ne samega interpreterja PHP: posodobitev Composerja ne zapre ranljivosti v PHP, kot je PHP2Shell.
Kaj je Composer in čemu služi?
Komaj katera aplikacija PHP danes obsega samo lastno kodo. Ogrodja, knjižnice za pošto, ustvarjanje PDF ali povezave za plačila pridejo kot končni paketi. Composer, upravljalnik paketov za PHP, poskrbi, da se ti paketi zberejo v ustreznih različicah in da vsaka odvisnost prinese svoje odvisnosti.
Za odločevalce to pomeni: velik del kode, ki teče na vašem strežniku, izvira od tretjih. To je učinkovito, a zahteva vzdrževanje. Za skrbnike in razvijalce to pomeni: kdor Composer uporablja čisto, lahko kadar koli izsledi, katera različica katere knjižnice teče v produkciji.
Standardni vir paketov je po dokumentaciji Composerja Packagist.org. Druge vire, na primer interne repozitorije agencije, je mogoče vpisati v composer.json pod repositories.
composer.json, composer.lock in vendor: trije gradniki
Composer dela s tremi stvarmi, ki jih je dobro poznati, preden prevzamete strežnik ali naročite agencijo.
| Gradnik | Vsebina | Ali sodi v repozitorij? |
|---|---|---|
composer.json |
želeni paketi z razponi različic (require, require-dev), pravila nalagalnika, nastavitve |
da |
composer.lock |
natančno razrešene različice vseh paketov, tudi posrednih | da, po dokumentaciji Composerja izrecno |
vendor/ |
prenesena koda paketov in ustvarjeni nalagalnik | ne, ustvari se ob namestitvi |
Pod require stojijo paketi, ki jih aplikacija potrebuje v delovanju. Pod require-dev stojijo orodja za razvoj in teste, na primer ogrodja za testiranje ali statična analiza. Ta delitev je pomembna, ker razvojna orodja na produkcijskem strežniku nimajo kaj iskati.
{
"require": {
"php": ">=8.3",
"monolog/monolog": "^3.0"
},
"require-dev": {
"phpunit/phpunit": "^11.0"
},
"autoload": {
"psr-4": { "App\\": "src/" }
}
}
Navedbe različic v primeru so izbrane samo za ponazoritev. Katere različice vaš projekt potrebuje, izhaja iz njegovih zahtev.
install ali update: razlika v delovanju
Ukaza zvenita podobno, a imata zelo različni posledici.
composer installpreberecomposer.lockin namesti natanko tam zabeležene različice. To je ponovljivo in sodi v dostavo.composer updateodvisnosti razreši znova, prenese najnovejše ustrezne različice incomposer.lockna novo napiše. To sodi v razvoj, z naknadnimi testi.
Po dokumentaciji Composerja update po zapisu datoteke lock dodatno izvede varnostno preverjanje (audit), če ga ne izklopite z --no-audit. install privzeto ne preverja; za to obstaja možnost --audit.
Samodejno nalaganje: kako Composer najde razrede
Composer ustvari datoteko vendor/autoload.php. Ko je enkrat vključena, PHP vsak razred naloži šele, ko je potreben. Za lastno kodo se v razdelku autoload določi, kateri imenski prostor leži v kateri mapi. Priporočen je PSR-4, standard PHP-FIG. Kako natančno to deluje, razlaga stran Imenski prostori in samodejno nalaganje; pregled vseh standardov daje stran Standardi PSR.
<?php
require __DIR__ . '/../vendor/autoload.php';
$log = new Monolog\Logger('app'); // se po potrebi samodejno naloži
Composer v produkciji: čista dostava
Za dostavo se je obnesel stalen vrstni red. Najbolje teče v cevovodu za gradnjo, ne ročno na strežniku.
- Preveriti datoteko lock:
composer validatezagotovi, da jecomposer.jsonveljaven incomposer.lockaktualen. - Namestiti brez razvojnih paketov:
composer install --no-devizpustirequire-dev. - Optimizirati nalagalnik:
--optimize-autoloader(na kratko-o) pravila pretvori v seznam razredov. Z--classmap-authoritativePHP razrede nalaga izključno s tega seznama. - Varnostno preverjanje:
composer audit --lockedpreveri različice iz datoteke lock glede na znana varnostna obvestila in javi opuščene pakete. - vendor zunaj korena spleta: po URL naj bo dosegljiva samo javna mapa z vstopno skripto.
composer validate
composer install --no-dev --optimize-autoloader
composer audit --locked --no-dev
composer outdated dodatno pokaže, kateri nameščeni paketi imajo novejše različice. To je podlaga za načrtovane posodobitve namesto naglih posameznih akcij.
Composer, varnost in PHP2Shell
Composer in PHP2Shell zadevata dve različni ravni. Ranljivosti CVE-2026-109618 in CVE-2026-109619 ležita v samem interpreterju PHP. Odpravljeni sta v PHP 8.5.12, 8.4.27, 8.3.36 in 8.2.35, nato pa je treba znova zagnati vse procese PHP. Noben composer update in noben paket v vendor pri tem ne spremeni ničesar.
Kljub temu sodi Composer v vsak pregled po incidentu. Kdor na strežnik prinese škodljivo kodo, lahko spremeni tudi datoteke v vendor, vendor/autoload.php pa se naloži ob vsaki zahtevi. Svež composer install iz preverjene datoteke lock v prazen imenik je zato dobra metoda za obnovitev stanja paketov. Kako odvisnosti redno preverjate glede znanih ranljivosti, opisuje vodnik composer audit.
Zelen composer audit ne pove ničesar o stanju popravkov PHP. Izvajalno okolje PHP preverite ločeno, na primer z našo storitvijo popravljanja PHP.
Kako PHP SOS pomaga konkretno?
- Za vsako aplikacijo zajamemo različico PHP, pakete Composer in stanje datoteke lock ter pri tem čisto ločimo med interpreterjem in knjižnicami.
- Preverimo, ali
vendorin datoteka lock drug drugemu ustrezata ter ali v produkciji ležijo razvojni paketi ali spremenjene datoteke. - Vzpostavimo ponovljivo dostavo z
install --no-dev, optimiranim nalagalnikom in auditom. - Po incidentu stanje paketov znova vzpostavimo iz preverjene datoteke lock in dokumentiramo rezultat.
Pogosta vprašanja
Ali mora biti composer.lock v repozitoriju Git?
Da. Dokumentacija Composerja izrecno priporoča, da composer.lock potrdite (commit). Samo tako razvoj, CI in produkcija namestijo popolnoma enake različice paketov.
Kakšna je razlika med composer install in composer update?
install namesti različice, zabeležene v composer.lock. update odvisnosti razreši znova, prenese ustrezne novejše različice in composer.lock na novo napiše. Na produkcijskem strežniku sodi samo install.
Ali posodobitev Composerja zapre ranljivost PHP2Shell?
Ne. Composer upravlja knjižnice vaše aplikacije, ne interpreterja PHP. PHP2Shell zapre samo posodobitev izvajalnega okolja PHP na odpravljeno različico in ponovni zagon vseh procesov PHP.
Kje naj leži mapa vendor?
Idealno zunaj javno dosegljivega spletnega imenika. Številna ogrodja v koren spleta postavijo samo mapo public, vendor pa leži eno raven više.