Stručně: Composer je správce balíčků pro PHP. Ze souboru composer.json načte, jaké knihovny projekt potřebuje, stáhne je do adresáře vendor, přesné verze zaznamená v composer.lock a vytvoří autoloader, který třídy automaticky najde. Composer tak spravuje kód vaší aplikace, nikoli samotný interpret PHP: aktualizace Composeru neuzavře zranitelnost v PHP, jako je PHP2Shell.
Co je Composer a k čemu slouží?
Dnes už téměř žádná aplikace PHP nestojí jen na vlastním kódu. Frameworky, knihovny pro e-maily, tvorba PDF nebo napojení plateb přicházejí jako hotové balíčky. Composer, správce balíčků pro PHP, zajišťuje, aby se tyto balíčky sešly ve vhodných verzích a aby každá závislost přinesla své vlastní závislosti.
Pro rozhodovatele to znamená: velká část kódu, který na vašem serveru běží, pochází od třetích stran. To je efektivní, ale vyžaduje to péči. Pro správce a vývojáře to znamená: kdo Composer používá čistě, může kdykoli dohledat, jaká verze které knihovny běží v produkci.
Standardním zdrojem balíčků je podle dokumentace Composeru Packagist.org. Další zdroje, například interní repozitáře agentury, lze zapsat do composer.json pod repositories.
composer.json, composer.lock a vendor: tři stavební kameny
Composer pracuje se třemi věcmi, které je dobré znát, než převezmete server nebo zadáte práci agentuře.
| Stavební kámen | Obsah | Patří do repozitáře? |
|---|---|---|
composer.json |
požadované balíčky s rozsahy verzí (require, require-dev), pravidla autoload, nastavení |
ano |
composer.lock |
přesně vyřešené verze všech balíčků, i nepřímých | ano, podle dokumentace Composeru výslovně |
vendor/ |
stažený kód balíčků a vytvořený autoloader | ne, vytváří se při instalaci |
Pod require jsou balíčky, které aplikace potřebuje v provozu. Pod require-dev jsou nástroje pro vývoj a testy, například testovací frameworky nebo statická analýza. Toto rozdělení je důležité, protože vývojové nástroje na produkčním serveru nemají co dělat.
{
"require": {
"php": ">=8.3",
"monolog/monolog": "^3.0"
},
"require-dev": {
"phpunit/phpunit": "^11.0"
},
"autoload": {
"psr-4": { "App\\": "src/" }
}
}
Údaje o verzích v příkladu jsou zvoleny jen pro ilustraci. Které verze váš projekt potřebuje, vyplývá z jeho požadavků.
install nebo update: rozdíl v provozu
Oba příkazy znějí podobně, ale mají velmi odlišné důsledky.
composer installčtecomposer.locka nainstaluje přesně tam zaznamenané verze. Je to reprodukovatelné a patří to do nasazení.composer updateznovu vyřeší všechny závislosti, stáhne nejnovější odpovídající verze a přepíšecomposer.lock. To patří do vývoje, s následnými testy.
Podle dokumentace Composeru provede update po zápisu souboru lock navíc bezpečnostní kontrolu (audit), pokud se nevypne pomocí --no-audit. install standardně nekontroluje; k tomu slouží volba --audit.
Autoloading: jak Composer najde třídy
Composer vytváří soubor vendor/autoload.php. Jakmile se jednou vloží, PHP načte každou třídu teprve ve chvíli, kdy je potřeba. Pro vlastní kód se v sekci autoload stanoví, který jmenný prostor leží v kterém adresáři. Doporučuje se k tomu PSR-4, standard skupiny PHP-FIG. Jak přesně to funguje, vysvětluje stránka Jmenné prostory a autoloading; přehled všech standardů poskytuje stránka Standardy PSR.
<?php
require __DIR__ . '/../vendor/autoload.php';
$log = new Monolog\Logger('app'); // načte se automaticky podle potřeby
Composer v produkci: čisté nasazení
Pro nasazení se osvědčilo pevné pořadí. Nejlépe probíhá v build pipeline a ne ručně na serveru.
- Zkontrolovat soubor lock:
composer validatezajistí, žecomposer.jsonje platný acomposer.lockaktuální. - Instalovat bez vývojových balíčků:
composer install --no-devvynechárequire-dev. - Optimalizovat autoloader:
--optimize-autoloader(zkráceně-o) převede pravidla na seznam tříd. S--classmap-authoritativenačítá PHP třídy výhradně z tohoto seznamu. - Bezpečnostní kontrola:
composer audit --lockedověří verze ze souboru lock proti známým bezpečnostním hlášením a hlásí opuštěné balíčky. - vendor mimo webroot: Přes URL by měl být dostupný jen veřejný adresář se vstupním skriptem.
composer validate
composer install --no-dev --optimize-autoloader
composer audit --locked --no-dev
composer outdated navíc ukazuje, které nainstalované balíčky mají novější verze. To je základ pro plánované aktualizace místo hektických jednotlivých akcí.
Composer, bezpečnost a PHP2Shell
Composer a PHP2Shell se týkají dvou různých úrovní. Zranitelnosti CVE-2026-109618 a CVE-2026-109619 leží v samotném interpretu PHP. Opraveny jsou v PHP 8.5.12, 8.4.27, 8.3.36 a 8.2.35 a poté je nutné restartovat všechny procesy PHP. Žádné composer update ani balíček ve vendor na tom nic nezmění.
Přesto patří Composer do každé kontroly po incidentu. Kdo dostane na server škodlivý kód, může měnit i soubory ve vendor, a vendor/autoload.php se načítá při každém požadavku. Čerstvé composer install z ověřeného souboru lock do prázdného adresáře je proto dobrý způsob, jak obnovit stav balíčků. Jak závislosti pravidelně kontrolovat na známé zranitelnosti, popisuje průvodce composer audit.
Zelený výsledek composer audit nic neříká o stavu záplat PHP. Běhové prostředí PHP kontrolujte zvlášť, například pomocí naší služby PHP-Patch.
Jak konkrétně pomáhá PHP SOS?
- Pro každou aplikaci zjistíme verzi PHP, balíčky Composeru a stav souboru lock a přitom čistě oddělíme interpret od knihoven.
- Ověříme, zda
vendora soubor lock k sobě sedí a zda v produkci neleží vývojové balíčky nebo změněné soubory. - Zřídíme reprodukovatelné nasazení s
install --no-dev, optimalizovaným autoloaderem a auditem. - Po incidentu obnovíme stav balíčků z ověřeného souboru lock a zdokumentujeme výsledek.
Časté dotazy
Musí být composer.lock v repozitáři Git?
Ano. Dokumentace Composeru výslovně doporučuje composer.lock commitovat. Jen tak instalují vývoj, CI a produkce přesně stejné verze balíčků.
Jaký je rozdíl mezi composer install a composer update?
install nainstaluje verze zaznamenané v composer.lock. update znovu vyřeší závislosti, stáhne odpovídající novější verze a přepíše composer.lock. Na produkční server patří jen install.
Uzavře aktualizace Composeru zranitelnost PHP2Shell?
Ne. Composer spravuje knihovny vaší aplikace, nikoli interpret PHP. PHP2Shell se uzavře jen aktualizací běhového prostředí PHP na opravenou verzi a restartem všech procesů PHP.
Kde má ležet adresář vendor?
V ideálním případě mimo veřejně dostupný webový adresář. Mnoho frameworků vkládá do webrootu jen adresář public, zatímco vendor leží o úroveň výš.