Trumpai: Composer yra PHP paketų tvarkyklė. Ji iš failo composer.json nuskaito, kokių bibliotekų reikia projektui, atsisiunčia jas į aplanką vendor, tikslias versijas užfiksuoja composer.lock ir sukuria automatinį klasių įkėlėją (autoloader), kuris klases randa pats. Taigi Composer valdo jūsų programos kodą, o ne patį PHP interpretatorių: Composer atnaujinimas neuždaro tokios PHP spragos kaip PHP2Shell.
Kas yra Composer ir kam jo reikia?
Šiandien vargu ar rasite PHP programą, sudarytą tik iš savo kodo. Karkasai, pašto bibliotekos, PDF kūrimas ar mokėjimų integracijos ateina kaip paruošti paketai. Composer, PHP paketų tvarkyklė, pasirūpina, kad šie paketai susidėtų tinkamomis versijomis ir kad kiekviena priklausomybė atsineštų savo priklausomybes.
Sprendimų priėmėjams tai reiškia: didelė dalis jūsų serveryje veikiančio kodo yra iš trečiųjų šalių. Tai efektyvu, bet reikalauja priežiūros. Administratoriams ir kūrėjams tai reiškia: kas Composer naudoja tvarkingai, bet kada gali atsekti, kokia kurios bibliotekos versija veikia gamyboje.
Pasak Composer dokumentacijos, standartinis paketų šaltinis yra Packagist.org. Kitus šaltinius, pavyzdžiui, vidines agentūros saugyklas, galima įrašyti composer.json skiltyje repositories.
composer.json, composer.lock ir vendor: trys dalys
Composer dirba su trimis dalykais, kuriuos verta žinoti prieš perimant serverį ar užsakant agentūrai.
| Dalis | Turinys | Ar priklauso saugyklai? |
|---|---|---|
composer.json |
pageidaujami paketai su versijų intervalais (require, require-dev), automatinio įkėlimo taisyklės, nustatymai |
taip |
composer.lock |
tiksliai išspręstos visų paketų versijos, taip pat netiesioginių | taip, pasak Composer dok. aiškiai |
vendor/ |
atsisiųstas paketų kodas ir sukurtas automatinis įkėlėjas | ne, sukuriamas diegiant |
Skiltyje require yra paketai, kurių programai reikia veikiant. Skiltyje require-dev yra kūrimo ir testavimo įrankiai, pavyzdžiui, testavimo karkasai ar statinė analizė. Šis atskyrimas svarbus, nes kūrimo įrankiams gamybos serveryje nėra vietos.
{
"require": {
"php": ">=8.3",
"monolog/monolog": "^3.0"
},
"require-dev": {
"phpunit/phpunit": "^11.0"
},
"autoload": {
"psr-4": { "App\\": "src/" }
}
}
Pavyzdžio versijų nurodymai pasirinkti tik iliustracijai. Kokių versijų reikia jūsų projektui, išplaukia iš jo reikalavimų.
install ar update: skirtumas eksploatuojant
Abi komandos skamba panašiai, bet turi labai skirtingas pasekmes.
composer installnuskaitocomposer.lockir įdiegia lygiai ten užfiksuotas versijas. Tai atkuriama ir priklauso pateikimui.composer updateiš naujo išsprendžia visas priklausomybes, atsisiunčia naujausias tinkamas versijas ir perrašocomposer.lock. Tai priklauso kūrimui, su vėlesniais testais.
Pasak Composer dokumentacijos, update po lock failo įrašymo papildomai atlieka saugumo patikrą (auditą), nebent ji išjungta su --no-audit. install pagal numatymą netikrina; tam yra parinktis --audit.
Automatinis įkėlimas: kaip Composer randa klases
Composer sukuria failą vendor/autoload.php. Kai jis kartą įtraukiamas, PHP kiekvieną klasę įkelia tik tada, kai jos prireikia. Savam kodui skiltyje autoload nustatoma, kuri vardų erdvė kuriame aplanke yra. Tam rekomenduojamas PSR-4, PHP-FIG standartas. Kaip tai veikia tiksliai, paaiškina puslapis Vardų erdvės ir automatinis įkėlimas; visų standartų apžvalgą pateikia puslapis PSR standartai.
<?php
require __DIR__ . '/../vendor/autoload.php';
$log = new Monolog\Logger('app'); // prireikus įkeliama automatiškai
Composer gamyboje: tvarkingas pateikimas
Pateikimui prigijo nustatyta eilės tvarka. Geriausia ją vykdyti kūrimo konvejeryje (build pipeline), o ne rankiniu būdu serveryje.
- Patikrinti lock failą:
composer validateužtikrina, kadcomposer.jsongalioja, ocomposer.lockaktualus. - Diegti be kūrimo paketų:
composer install --no-devpraleidžiarequire-dev. - Optimizuoti automatinį įkėlėją:
--optimize-autoloader(trumpai-o) paverčia taisykles klasių sąrašu. Su--classmap-authoritativePHP klases įkelia tik iš šio sąrašo. - Saugumo patikra:
composer audit --lockedtikrina lock faile esančias versijas pagal žinomus saugumo pranešimus ir praneša apie paliktus paketus. - vendor už žiniatinklio šaknies: per URL turėtų būti pasiekiamas tik viešasis aplankas su įėjimo skriptu.
composer validate
composer install --no-dev --optimize-autoloader
composer audit --locked --no-dev
composer outdated papildomai parodo, kurie įdiegti paketai turi naujesnių versijų. Tai planuojamų atnaujinimų pagrindas vietoj skubotų pavienių veiksmų.
Composer, saugumas ir PHP2Shell
Composer ir PHP2Shell liečia du skirtingus lygius. Spragos CVE-2026-109618 ir CVE-2026-109619 yra pačiame PHP interpretatoriuje. Ištaisytos PHP 8.5.12, 8.4.27, 8.3.36 ir 8.2.35, ir po to visi PHP procesai turi būti paleisti iš naujo. Joks composer update ir joks paketas vendor to nekeičia.
Vis dėlto Composer priklauso kiekvienai patikrai po incidento. Kas patalpina kenkėjišką kodą serveryje, gali pakeisti ir failus vendor, o vendor/autoload.php įkeliamas per kiekvieną užklausą. Todėl šviežias composer install iš patikrinto lock failo į tuščią katalogą yra geras būdas atkurti paketų rinkinį. Kaip reguliariai tikrinti priklausomybes dėl žinomų spragų, aprašo vadovas composer audit.
Žalias composer audit nieko nesako apie PHP pataisų būseną. PHP vykdymo aplinką tikrinkite atskirai, pavyzdžiui, mūsų PHP pataisų paslauga.
Kaip PHP SOS padeda konkrečiai?
- Kiekvienai programai surenkame PHP versiją, Composer paketus ir lock būseną, aiškiai atskirdami interpretatorių nuo bibliotekų.
- Tikriname, ar
vendorir lock failas dera tarpusavyje ir ar gamyboje nėra kūrimo paketų ar pakeistų failų. - Įrengiame atkuriamą pateikimą su
install --no-dev, optimizuotu automatiniu įkėlėju ir auditu. - Po incidento paketų rinkinį iš naujo atkuriame iš patikrinto lock failo ir dokumentuojame rezultatą.
Dažni klausimai
Ar composer.lock turi būti Git saugykloje?
Taip. Composer dokumentacija aiškiai rekomenduoja įtraukti composer.lock į saugyklą (commit). Tik taip kūrimo aplinka, CI ir gamyba įdiegia lygiai tas pačias paketų versijas.
Kuo skiriasi composer install ir composer update?
install įdiegia versijas, užfiksuotas composer.lock. update iš naujo išsprendžia priklausomybes, atsisiunčia tinkamas naujesnes versijas ir perrašo composer.lock. Gamybos serveryje turi būti tik install.
Ar Composer atnaujinimas uždaro PHP2Shell spragą?
Ne. Composer valdo jūsų programos bibliotekas, o ne PHP interpretatorių. PHP2Shell uždaroma tik atnaujinus PHP vykdymo aplinką iki ištaisytos versijos ir iš naujo paleidus visus PHP procesus.
Kur turėtų būti vendor aplankas?
Idealiu atveju už viešai pasiekiamo žiniatinklio katalogo ribų. Daugelis karkasų į žiniatinklio šaknį deda tik public aplanką, o vendor yra vienu lygiu aukščiau.