Na kratko: PSR-ji (PHP Standards Recommendations) so standardi skupine PHP-FIG, združenja uveljavljenih projektov PHP. Določajo skupna pravila in vmesnike, na primer PSR-4 za samodejno nalaganje, PSR-3 za loggerje, PSR-7 za sporočila HTTP in PSR-11 za vsebnike. Vsak PSR ima stanje: sprejet, osnutek, zastarel ali opuščen. PSR-ji naredijo kodo bolj zamenljivo in lažje preverljivo, ne zapirajo pa vrzeli v interpreterju PHP, kot je PHP2Shell.
Kaj sta PHP-FIG in PSR-ji?
PHP-FIG pomeni PHP Framework Interop Group. Skupina sama svoj cilj opisuje kot napredek PHP s sodelovanjem in standardi. Za PSR torej ne stoji noben proizvajalec, temveč uskladitev med projekti, ki želijo svojo programsko opremo ohranjati medsebojno združljivo.
Za odločevalce je korist oprijemljiva: če se aplikacija drži vmesnikov PSR, je mogoče na primer zamenjati knjižnico za beleženje, ne da bi se dotaknili vse kode. To zmanjša odvisnost od posameznih paketov in izvajalcev.
Pot PSR: od Pre-Draft do Accepted
Statut PHP-FIG opisuje fiksen potek:
- Pre-Draft: razjasni se, ali je dovolj zanimanja. Oblikuje se delovna skupina, po uspešnem glasovanju predlog dobi številko PSR.
- Draft: predlog se izdela, alternative in utemeljitve gredo v metadokument.
- Review: skupnost specifikacijo preizkuša s poskusnimi implementacijami, najmanj štiri tedne in dokler ni na voljo dveh neodvisnih, uporabnih izvedb.
- Accepted: po uspešnem glasovanju je PSR sprejet; delovna skupina se razpusti.
Poleg tega obstajata še dve stanji. Deprecated pomeni: sprejet, a ni več priporočen, večinoma ker ga nadomešča novejši standard. Abandoned pomeni: delo na njem se ne nadaljuje.
Vsi PSR-ji s stanjem
Stanje po pregledu PHP-FIG v času nastanka te strani:
| Št. | Naslov | Stanje |
|---|---|---|
| PSR-0 | Autoloading Standard | zastarel |
| PSR-1 | Basic Coding Standard | sprejet |
| PSR-2 | Coding Style Guide | zastarel |
| PSR-3 | Logger Interface | sprejet |
| PSR-4 | Autoloading Standard | sprejet |
| PSR-5 | PHPDoc Standard | osnutek |
| PSR-6 | Caching Interface | sprejet |
| PSR-7 | HTTP Message Interface | sprejet |
| PSR-8 | Huggable Interface | opuščen |
| PSR-9 | Security Advisories | opuščen |
| PSR-10 | Security Reporting Process | opuščen |
| PSR-11 | Container Interface | sprejet |
| PSR-12 | Extended Coding Style Guide | sprejet |
| PSR-13 | Hypermedia Links | sprejet |
| PSR-14 | Event Dispatcher | sprejet |
| PSR-15 | HTTP Handlers | sprejet |
| PSR-16 | Simple Cache | sprejet |
| PSR-17 | HTTP Factories | sprejet |
| PSR-18 | HTTP Client | sprejet |
| PSR-19 | PHPDoc tags | osnutek |
| PSR-20 | Clock | sprejet |
| PSR-21 | Internationalization | osnutek |
| PSR-22 | Application Tracing | osnutek |
Najpomembnejši PSR-ji za prakso
- PSR-4 (samodejno nalaganje): imena razredov preslika v poti datotek in je osnova nalagalnika Composer. Podrobnosti na strani Imenski prostori in samodejno nalaganje.
- PSR-1 in PER Coding Style: skupna pravila za zapis in oblikovanje. PER Coding Style po navedbah PHP-FIG razširja in nadomešča PSR-12 ter predpostavlja PSR-1.
- PSR-3 (Logger): enoten vmesnik loggerja v imenskem prostoru
Psr\Logz osmimi stopnjami odemergencydodebug. - PSR-7, PSR-15, PSR-17, PSR-18 (HTTP): vmesniki za zahteve in odgovore, vmesno programje (middleware), tovarne in odjemalce HTTP. Številna ogrodja PHP temeljijo nanje ali ponujajo mostove.
- PSR-11 (vsebnik): skupni vmesnik za vsebnike vbrizgavanja odvisnosti (dependency injection).
- PSR-6 in PSR-16 (predpomnilnik): dva vmesnika za vmesni pomnilnik, obsežen in preprost.
- PSR-14 in PSR-20 (dogodki, ura): skupna vmesnika za dogodke in za trenutni čas. Zamenljiva ura naredi kodo, odvisno od časa, na primer potek veljavnosti žetonov, dobro preizkusljivo.
Številke sicer ne povedo ničesar o pomenu. Dodelijo se ob vstopu v fazo osnutka, zato med pomembnimi, sprejetimi standardi stojijo zastareli in opuščeni predlogi.
<?php
use Psr\Log\LoggerInterface;
final class Bestellimport
{
public function __construct(private LoggerInterface $log) {}
public function importieren(string $datei): void
{
try {
// ... obdelava datoteke ...
} catch (\Throwable $e) {
$this->log->error('Import von {datei} fehlgeschlagen', [
'datei' => basename($datei),
'exception' => $e,
]);
}
}
}
Kaj imajo PSR-ji opraviti z varnostjo
Več standardov se neposredno dotika varnosti. PSR-3 določa, da se izjeme v kontekstu posredujejo pod ključem exception in da se označbe mest, kot je {datei}, nadomestijo iz konteksta. Vrednosti pri tem ne smejo biti vnaprej maskirane, ker logger ne ve, kje se bodo pozneje prikazale. Kdor dnevnike prikazuje v spletnem vmesniku, mora maskirati tam. Več o tem v prispevku Varno beleženje.
PSR-7 opisuje sporočila HTTP kot nespremenljive objekte in z UploadedFileInterface::moveTo() ponuja enoten način za shranjevanje naloženih datotek. Specifikacija zahteva, da je izvirna datoteka potem odstranjena. Preverjanje tipa datoteke in ciljnega mesta ostaja naloga aplikacije.
Omembe vredno je, da sta bila PSR-9 (Security Advisories) in PSR-10 (Security Reporting Process) opuščena. Skupnega standarda za varnostna sporočila tako ni; vsak projekt to ureja sam. Kako z vrzelmi ravna sam projekt PHP, opisuje stran Kako projekt PHP obravnava varnostne vrzeli.
Proti PHP2Shell standardi ne pomagajo: ranljivosti CVE-2026-109618 in CVE-2026-109619 ležita v interpreterju. Obvezna sta posodobitev na PHP 8.5.12, 8.4.27, 8.3.36 ali 8.2.35 in ponovni zagon vseh procesov PHP.
Kako PHP SOS pomaga konkretno?
- Preverimo, kako vaša aplikacija beleži, in poskrbimo, da izjeme pristanejo v dnevniku, dostopni podatki ali identifikatorji sej pa ne.
- Ocenimo, kako sta izvedena obdelava nalaganja in HTTP, tudi če poteka prek knjižnic PSR-7.
- Lastne razvoje preiščemo v okviru varnostnega pregleda in penetracijskega testa.
- Namestimo posodobitve PHP, znova zaženemo vse workerje in dokumentiramo stanje.
Pogosta vprašanja
Kaj pomeni PSR?
PSR pomeni PHP Standards Recommendation. Priporočila pripravlja in usklajuje PHP-FIG, PHP Framework Interop Group. So prostovoljna, a jih uresničuje veliko ogrodij in knjižnic.
Ali PSR-12 še velja?
PSR-12 PHP-FIG še naprej vodi kot sprejetega. Je pa PHP-FIG s PER Coding Style objavil naslednika, ki po lastni navedbi PSR-12 razširja in nadomešča. Tam je trenutno različica 3.1.
Ali obstaja PSR za varnostna sporočila?
Bila sta dva predloga, PSR-9 za varnostna obvestila in PSR-10 za postopek poročanja o varnostnih vrzelih. PHP-FIG oba vodi kot opuščena. Projekti zato postopek poročanja urejajo sami.
Ali mora moj projekt upoštevati PSR-je?
Ne, obveznosti ni. PSR-4 za samodejno nalaganje in vmesniki, kot sta PSR-3 ali PSR-7, pa bistveno olajšajo uporabo tujih paketov in menjavo izvajalcev.