Lühidalt: PSR-id (PHP Standards Recommendations) on PHP-FIG standardid, mis on väljakujunenud PHP projektide rühm. Need seavad ühised reeglid ja liidesed, näiteks PSR-4 automaatlaadimiseks, PSR-3 loggerite jaoks, PSR-7 HTTP-sõnumite jaoks ja PSR-11 konteinerite jaoks. Igal PSR-il on staatus: aktsepteeritud, mustand, iganenud või hüljatud. PSR-id teevad koodi vahetatavamaks ja kergemini kontrollitavaks, kuid ei sulge PHP interpretaatori turvauke nagu PHP2Shell.
Mis on PHP-FIG ja mis on PSR-id?
PHP-FIG tähendab PHP Framework Interop Group. Rühm kirjeldab oma eesmärki ise nii, et edendada PHP-d koostöö ja standardite kaudu. PSR-i taga ei seisa seega tootja, vaid projektide vaheline kokkulepe, mis tahavad oma tarkvara omavahel ühilduvana hoida.
Otsustajale on kasu käegakatsutav: kui rakendus peab kinni PSR-liidestest, saab näiteks logimisteegi välja vahetada, kogu koodi puutumata. See vähendab sõltuvust üksikutest pakettidest ja teenusepakkujatest.
PSR-i tee: Pre-Draftist Accepted'ini
PHP-FIG põhikiri kirjeldab kindlat kulgu:
- Pre-Draft: selgitatakse, kas huvi on piisav. Moodustub töörühm, eduka hääletuse järel saab ettepanek PSR-numbri.
- Draft: ettepanek töötatakse välja, alternatiivid ja põhjendused lähevad metadokumenti.
- Review: kogukond testib spetsifikatsiooni näidisrealisatsioonidega, vähemalt neli nädalat ja seni, kuni on olemas kaks sõltumatut, elujõulist rakendust.
- Accepted: pärast eduka hääletust on PSR vastu võetud; töörühm saadetakse laiali.
Lisaks on kaks muud olekut. Deprecated tähendab: vastu võetud, kuid enam mitte soovitatav, enamasti sellepärast, et uuem standard asendab seda. Abandoned tähendab: sellega ei tegeleta enam.
Kõik PSR-id staatusega
Seis PHP-FIG ülevaate järgi selle lehe koostamise ajal:
| Nr. | Pealkiri | Staatus |
|---|---|---|
| PSR-0 | Autoloading Standard | iganenud |
| PSR-1 | Basic Coding Standard | aktsepteeritud |
| PSR-2 | Coding Style Guide | iganenud |
| PSR-3 | Logger Interface | aktsepteeritud |
| PSR-4 | Autoloading Standard | aktsepteeritud |
| PSR-5 | PHPDoc Standard | mustand |
| PSR-6 | Caching Interface | aktsepteeritud |
| PSR-7 | HTTP Message Interface | aktsepteeritud |
| PSR-8 | Huggable Interface | hüljatud |
| PSR-9 | Security Advisories | hüljatud |
| PSR-10 | Security Reporting Process | hüljatud |
| PSR-11 | Container Interface | aktsepteeritud |
| PSR-12 | Extended Coding Style Guide | aktsepteeritud |
| PSR-13 | Hypermedia Links | aktsepteeritud |
| PSR-14 | Event Dispatcher | aktsepteeritud |
| PSR-15 | HTTP Handlers | aktsepteeritud |
| PSR-16 | Simple Cache | aktsepteeritud |
| PSR-17 | HTTP Factories | aktsepteeritud |
| PSR-18 | HTTP Client | aktsepteeritud |
| PSR-19 | PHPDoc tags | mustand |
| PSR-20 | Clock | aktsepteeritud |
| PSR-21 | Internationalization | mustand |
| PSR-22 | Application Tracing | mustand |
Praktikas olulisemad PSR-id
- PSR-4 (automaatlaadimine): seab klassinimed failiteedega vastavusse ja on Composeri autolaaduri alus. Üksikasjad lehel Nimeruumid ja automaatlaadimine.
- PSR-1 ja PER Coding Style: ühised reeglid kirjaviisi ja vormingu kohta. PER Coding Style laiendab ja asendab PHP-FIG andmetel PSR-12 ning eeldab PSR-1.
- PSR-3 (Logger): ühtne logeri liides nimeruumis
Psr\Logkaheksa tasemega alatesemergencykunidebug. - PSR-7, PSR-15, PSR-17, PSR-18 (HTTP): liidesed päringute ja vastuste, vahevara (middleware), vabrikute ja HTTP-klientide jaoks. Paljud PHP raamistikud ehitavad neile või pakuvad sildu.
- PSR-11 (konteiner): ühine liides Dependency-Injection-konteineritele.
- PSR-6 ja PSR-16 (vahemälu): kaks liidest vahemälu jaoks, üks põhjalik ja üks lihtne.
- PSR-14 ja PSR-20 (sündmused, kell): ühised liidesed sündmuste ja praeguse aja jaoks. Vahetatav kell teeb ajast sõltuva koodi, näiteks tokenite aegumise, hästi testitavaks.
Numbrid ei ütle muide tähtsuse kohta midagi. Need antakse välja mustandifaasi sisenemisel, seetõttu seisavad iganenud ja hüljatud ettepanekud olulisemate, aktsepteeritud standardite vahel.
<?php
use Psr\Log\LoggerInterface;
final class Bestellimport
{
public function __construct(private LoggerInterface $log) {}
public function importieren(string $datei): void
{
try {
// ... faili töötlemine ...
} catch (\Throwable $e) {
$this->log->error('Import von {datei} fehlgeschlagen', [
'datei' => basename($datei),
'exception' => $e,
]);
}
}
}
Mis seos on PSR-idel turvalisusega
Mitu standardit puudutavad turvalisust otse. PSR-3 sätestab, et erandid antakse kontekstis edasi võtme exception all ning kohatäitjad nagu {datei} asendatakse kontekstist. Väärtusi ei tohi seejuures ette maskeerida, sest logija ei tea, kus neid hiljem kuvatakse. Kes kuvab logisid veebiliideses, peab seal maskeerima. Lähemalt artiklis Turvaline logimine.
PSR-7 kirjeldab HTTP-sõnumeid muutumatute objektidena ja pakub meetodiga UploadedFileInterface::moveTo() ühtset viisi üleslaaditud failide salvestamiseks. Spetsifikatsioon nõuab, et algfail on pärast seda eemaldatud. Failitüübi ja sihtkoha kontrollimine jääb rakenduse ülesandeks.
Tähelepanuväärne on, et PSR-9 (Security Advisories) ja PSR-10 (Security Reporting Process) on hüljatud. Ühist standardit turvateadete jaoks seega ei ole; iga projekt reguleerib seda ise. Kuidas PHP projekt ise turvaaukudega ümber käib, kirjeldab leht Kuidas PHP projekt turvaauke käsitleb.
PHP2Shelli vastu standardid ei aita: turvaaugud CVE-2026-109618 ja CVE-2026-109619 asuvad interpretaatoris. Kohustuslik on uuendus versioonile PHP 8.5.12, 8.4.27, 8.3.36 või 8.2.35 ja kõigi PHP protsesside taaskäivitus.
Kuidas PHP SOS konkreetselt aitab?
- Kontrollime, kuidas teie rakendus logib, ja tagame, et erandid satuvad logisse, aga ligipääsuandmed või sessioonitunnused mitte.
- Hindame, kuidas üleslaadimise ja HTTP töötlus on realiseeritud, ka siis, kui see käib PSR-7 teekide kaudu.
- Uurime omaarendusi turvaauditi ja penetratsioonitesti raames.
- Paigaldame PHP uuendused, käivitame kõik workerid uuesti ja dokumenteerime seisu.
Korduma kippuvad küsimused
Mida tähendab PSR?
PSR tähendab PHP Standards Recommendation. Soovitused töötab välja ja lepib kokku PHP-FIG ehk PHP Framework Interop Group. Need on vabatahtlikud, kuid paljud raamistikud ja teegid rakendavad neid.
Kas PSR-12 kehtib veel?
PHP-FIG-is on PSR-12 endiselt aktsepteeritud staatusega. PHP-FIG on aga avaldanud järglase, PER Coding Style, mis oma sõnul laiendab ja asendab PSR-12. Praegu on seal versioon 3.1.
Kas turvateadete jaoks on olemas PSR?
Oli kaks ettepanekut, PSR-9 turvateadete (Security Advisories) jaoks ja PSR-10 turvaaukudest teatamise protsessi jaoks. Mõlemad on PHP-FIG-is hüljatud. Projektid reguleerivad oma teavitusprotsessi seetõttu ise.
Kas minu projekt peab PSR-e järgima?
Ei, kohustust ei ole. Automaatlaadimise PSR-4 ja liidesed nagu PSR-3 või PSR-7 muudavad aga võõraste pakettide kasutamise ja teenusepakkujate vahetuse tunduvalt lihtsamaks.