Ukratko: Composer je upravitelj paketa za PHP. Iz datoteke composer.json čita koje biblioteke projekt treba, učitava ih u mapu vendor, točne verzije bilježi u composer.lock i stvara autoloader koji automatski pronalazi klase. Composer tako upravlja kodom Vaše aplikacije, a ne samim PHP interpreterom: Composer ažuriranje ne zatvara ranjivost u PHP-u poput PHP2Shella.
Što je Composer i čemu služi?
Jedva koja PHP aplikacija danas sadrži samo vlastiti kod. Frameworci, biblioteke za e-poštu, izrada PDF-ova ili povezivanje plaćanja dolaze kao gotovi paketi. Composer, upravitelj paketa za PHP, brine da se ti paketi okupe u odgovarajućim verzijama i da svaka ovisnost donese vlastite ovisnosti.
Za donositelje odluka to znači: velik dio koda koji radi na Vašem poslužitelju potječe od trećih strana. To je učinkovito, ali traži njegu. Za administratore i razvijatelje to znači: tko Composer uredno koristi, u svakom trenutku može pratiti koja verzija koje biblioteke radi u produkciji.
Standardni izvor paketa prema Composer dokumentaciji je Packagist.org. Dodatni izvori, na primjer interni repozitoriji agencije, mogu se upisati u composer.json pod repositories.
composer.json, composer.lock i vendor: tri gradivna dijela
Composer radi s tri stvari koje valja poznavati prije nego što preuzmete poslužitelj ili angažirate agenciju.
| Gradivni dio | Sadržaj | Pripada li u repozitorij? |
|---|---|---|
composer.json |
željeni paketi s rasponima verzija (require, require-dev), pravila autoloada, postavke |
da |
composer.lock |
točno razriješene verzije svih paketa, i neizravnih | da, prema Composer dokumentaciji izričito |
vendor/ |
preuzeti kod paketa i stvoreni autoloader | ne, stvara se pri instalaciji |
Pod require stoje paketi koje aplikacija treba u radu. Pod require-dev stoje alati za razvoj i testiranje, na primjer okviri za testiranje ili statička analiza. Ta je podjela važna jer razvojni alati na produkcijskom poslužitelju nemaju što tražiti.
{
"require": {
"php": ">=8.3",
"monolog/monolog": "^3.0"
},
"require-dev": {
"phpunit/phpunit": "^11.0"
},
"autoload": {
"psr-4": { "App\\": "src/" }
}
}
Navedene verzije u primjeru odabrane su samo radi ilustracije. Koje verzije Vaš projekt treba, proizlazi iz njegovih zahtjeva.
install ili update: razlika u radu
Obje naredbe zvuče slično, ali imaju vrlo različite posljedice.
composer installčitacomposer.locki instalira točno verzije zabilježene u njoj. To je ponovljivo i pripada u isporuku.composer updateiznova razrješava sve ovisnosti, dohvaća najnovije odgovarajuće verzije i iznova pišecomposer.lock. To pripada u razvoj, uz naknadne testove.
Prema Composer dokumentaciji update nakon pisanja lock datoteke dodatno provodi sigurnosnu provjeru (audit), osim ako se isključi pomoću --no-audit. install prema zadanim postavkama ne provjerava; za to postoji opcija --audit.
Autoloading: kako Composer pronalazi klase
Composer stvara datoteku vendor/autoload.php. Kada se jednom uključi, PHP svaku klasu učitava tek kada je zatreba. Za vlastiti kod u odjeljku autoload određuje se koji namespace leži u kojoj mapi. Za to se preporučuje PSR-4, standard PHP-FIG-a. Kako to točno radi, objašnjava stranica Namespaces i autoloading; pregled svih standarda daje stranica PSR standardi.
<?php
require __DIR__ . '/../vendor/autoload.php';
$log = new Monolog\Logger('app'); // učitava se automatski po potrebi
Composer u produkciji: uredna isporuka
Za isporuku se pokazao dobrim čvrst redoslijed. Najbolje ga je izvoditi u build pipelineu, a ne ručno na poslužitelju.
- Provjeriti lock datoteku:
composer validateosigurava da jecomposer.jsonvaljan i da jecomposer.lockaktualan. - Instalirati bez razvojnih paketa:
composer install --no-devizostavljarequire-dev. - Optimizirati autoloader:
--optimize-autoloader(skraćeno-o) pretvara pravila u popis klasa. S--classmap-authoritativePHP klase učitava isključivo s tog popisa. - Sigurnosna provjera:
composer audit --lockedprovjerava verzije iz lock datoteke prema poznatim sigurnosnim objavama i prijavljuje napuštene pakete. - vendor izvan webroota: Putem URL-a smije biti dostupna samo javna mapa s ulaznom skriptom.
composer validate
composer install --no-dev --optimize-autoloader
composer audit --locked --no-dev
composer outdated dodatno pokazuje koji instalirani paketi imaju novije verzije. To je osnova za planirana ažuriranja umjesto užurbanih pojedinačnih akcija.
Composer, sigurnost i PHP2Shell
Composer i PHP2Shell tiču se dviju različitih razina. Ranjivosti CVE-2026-109618 i CVE-2026-109619 leže u samom PHP interpreteru. Otklonjene su u PHP-u 8.5.12, 8.4.27, 8.3.36 i 8.2.35, a nakon toga se svi PHP procesi moraju ponovno pokrenuti. Nikakav composer update ni paket u vendor tu ništa ne mijenja.
Ipak, Composer pripada u svaku provjeru nakon incidenta. Tko na poslužitelj unese zlonamjerni kod, može mijenjati i datoteke u vendor, a vendor/autoload.php učitava se pri svakom zahtjevu. Svježi composer install iz provjerene lock datoteke u prazan direktorij stoga je dobra metoda za ponovnu uspostavu stanja paketa. Kako ovisnosti redovito provjeravati zbog poznatih ranjivosti, opisuje vodič composer audit.
Zeleni composer audit ne govori ništa o razini zakrpa PHP-a. PHP izvršno okruženje provjeravajte zasebno, na primjer našom PHP Patch uslugom.
Kako PHP SOS konkretno pomaže?
- Za svaku aplikaciju evidentiramo PHP verziju, Composer pakete i stanje lock datoteke te pritom uredno razdvajamo interpreter i biblioteke.
- Provjeravamo odgovaraju li
vendori lock datoteka jedno drugome te leže li u produkciji razvojni paketi ili izmijenjene datoteke. - Uspostavljamo ponovljivu isporuku s
install --no-dev, optimiziranim autoloaderom i auditom. - Nakon incidenta iznova uspostavljamo stanje paketa iz provjerene lock datoteke i dokumentiramo rezultat.
Česta pitanja
Mora li composer.lock u Git repozitorij?
Da. Composer dokumentacija izričito preporučuje commitanje datoteke composer.lock. Samo tako razvoj, CI i produkcija instaliraju potpuno iste verzije paketa.
Koja je razlika između composer install i composer update?
install instalira verzije zabilježene u composer.lock. update iznova razrješava ovisnosti, dohvaća odgovarajuće novije verzije i iznova piše composer.lock. Na produkcijski poslužitelj pripada samo install.
Zatvara li Composer ažuriranje PHP2Shell ranjivost?
Ne. Composer upravlja bibliotekama Vaše aplikacije, a ne PHP interpreterom. PHP2Shell zatvara samo ažuriranje PHP izvršnog okruženja na ispravljenu verziju i ponovno pokretanje svih PHP procesa.
Gdje bi trebala biti mapa vendor?
Idealno izvan javno dostupnog web-direktorija. Mnogi frameworci u webroot stavljaju samo mapu public, dok vendor leži jednu razinu iznad.