Lühidalt: PHP laiendused (extensions) on C-keeles moodulid, mis täiendavad PHP-d funktsioonidega, näiteks andmebaasidraiverid (PDO), krüpteerimine (Sodium, OpenSSL) või baitkoodi vahemälu OPcache. PHP käsiraamat eristab Core-, Bundled-, External- ja PECL-laiendusi. Laaditakse need failis php.ini direktiividega extension või zend_extension. Iga laiendus töötab PHP protsessis selle õigustega. Seetõttu kehtib: laadige ainult see, mida vaja, ja uuendage koos PHP-ga.
Mis on PHP laiendused?
PHP tuum, Zend Engine, oskab koodi käivitada, kuid paljud rakenduste vajatav asub laiendustes. Need on kirjutatud C-keeles ja kas kompileeritakse PHP sisse kindlalt või laaditakse käivitamisel jagatud teegina (.so Linuxis, .dll Windowsis).
Otsustajale on oluline: laiendused ei ole rakenduse pistikprogrammid, vaid PHP käitusaja osa. Neid paigaldab veebimajutaja või serveri administraator, mitte agentuur CMS-is. Kui laiendus puudub, teatab rakendus tavaliselt veast paigaldamisel või uuendamisel.
Sama oluline on piiritlemine Composeri pakettidest. Composer paigaldab teeke, mis on kirjutatud PHP-s ja asuvad projektikaustas, näiteks meili- või PDF-pakett. Laiendused seevastu on kompileeritud kood, mis laaditakse PHP käivitamisel ja kehtib kõigi serveri rakenduste jaoks. Paljud Composeri paketid eeldavad teatud laiendusi ja märgivad selle oma composer.json failis kirjetega nagu ext-intl või ext-sodium. Kes tahab kontrollida, kas projekt leiab kõik vajalikud laiendused, saab projektikaustas käivitada composer check-platform-reqs.
Millised laienduste liigid on olemas?
PHP käsiraamat jaotab laiendused nelja rühma:
| Rühm | Tähendus käsiraamatu järgi | Näited käsiraamatust |
|---|---|---|
| Core | PHP tuuma osa, ei saa välja lülitada | Arrays, Date/Time, Hash, JSON, PCRE, SPL, Strings |
| Bundled | tarnitakse PHP-ga | BC Math, Ctype, Fileinfo, Filter, GD, intl, mbstring, PDO, Sessions |
| External | tarnitakse PHP-ga, vajavad väliseid teeke | cURL, DOM, GMP, LDAP, OpenSSL, Sodium, Zip |
| PECL | saadaval PECL-i kaudu, osaliselt väliste teekidega | APCu, Memcached, MongoDB, Yaml |
Jaotus võib muutuda. PHP 8.4-ga eemaldati väljalaskelehe järgi laiendused IMAP, OCI8, PDO_OCI ja pspell tarnekomplektist ning viidi PECL-i. Kes neid kasutab, vajab pärast uuendust eraldi paigaldust, mida tuleb samuti hooldada.
Kuidas laiendusi laaditakse?
Jagatud laiendusi laaditakse käsiraamatu järgi failis php.ini direktiiviga extension; Zend-laiendusi, mis sekkuvad mootorisse sügavamalt, direktiiviga zend_extension. Mõlemad tohivad olla ainult failis php.ini. Kataloogi määrab extension_dir, mille jaoks käsiraamat soovitab absoluutset teed.
; tavalised laiendused
extension=pdo_mysql
extension=sodium
extension=intl
; Zend-laiendus: OPcache (laadida enne Xdebugi, kui mõlemad on aktiivsed)
zend_extension=opcache
Distributsioonid nagu Debian ja Ubuntu paigutavad iga laienduse jaoks oma väikese .ini faili skannimiskataloogi, näiteks asukohta /etc/php/8.3/mods-available/, ning aktiveerivad selle SAPI kaupa käskudega phpenmod ja phpdismod. Kuidas PHP neid faile sisse loeb, selgitab php.ini selgitus.
Paigaldatakse laiendusi enamasti paketihalduse kaudu, näiteks paketina php8.3-intl. PECL laiendusi saab ehitada käskudega pecl või phpize. Käsiraamatu järgi on PECL kasutuselt kõrvaldatud; soovitatakse PHP Installer for Extensions'it (PIE). Kes ehitab PHP-d täielikult ise, leiab vihjeid lehelt PHP kompileerimine lähtekoodist.
Laienduste kontroll: millised on tegelikult laaditud?
Järgmised käsud on puhtalt lugevad. Arvestage, et käsurida võib laadida teisi laiendusi kui veebisait.
php -m # CLI moodulid
php-fpm8.3 -m # PHP-FPM 8.3 moodulid (nimi sõltub distributsioonist)
php --re sodium | head -n 5 # laienduse funktsioonid
php --ri opcache # laienduse seadistus
php -r 'var_dump(extension_loaded("intl"));'
Koodis kontrollivad rakendused funktsiooniga extension_loaded(), kas laiendus on olemas, ja funktsiooniga get_loaded_extensions(), millised on laaditud:
<?php
$benoetigt = ['pdo_mysql', 'mbstring', 'intl', 'sodium'];
$fehlend = array_diff($benoetigt, array_map('strtolower', get_loaded_extensions()));
echo $fehlend ? 'Fehlt: ' . implode(', ', $fehlend) : 'Alle Erweiterungen vorhanden';
Laiendused ja turvalisus: vähem on rohkem
Laiendused töötavad samas protsessis kui PHP ja samade õigustega. Laienduse viga võib seetõttu olla sama raske kui tuumas olev viga. Sellest tulenevad neli reeglit:
- Laadige ainult see, mida vaja. Iga lisalaiendus suurendab ründepinda. Kontrollige oma loetelu rakenduse süsteeminõuete vastu.
- Uuendage koos PHP-ga. Kaasa antud laiendused tulevad PHP uuendusega. PECL ja kolmandate osapoolte laiendused vajavad oma uuendusi ja peavad sobima uue PHP versiooniga.
- Arendustööriistad mitte tootmisse. Siluri- ja profiilitööriistad nagu Xdebug kuuluvad ainult arenduskeskkondadesse.
- Funktsioone sihipäraselt lukustada. Kus laiendused toovad kaasa süsteemikäskude funktsioone, aitab disable_functions õige kasutamine.
PHP2Shelli puhul asuvad augud PHP tuumas, mitte laiendis. Moodulite väljalülitamine neid ei sulge; vajalik on uuendus versioonile 8.5.12, 8.4.27, 8.3.36 või 8.2.35 koos kõigi PHP protsesside taaskäivitusega. Pärast uuendust peaksite kontrollima, kas kõik laiendused on jälle laaditud, sest puuduvad moodulid jäävad sageli märkamatuks kuni teatud funktsioonideni. Kuidas sõltuvusi püsivalt kontrolli all hoida, kirjeldab Sõltuvuste ajakohasena hoidmine.
Kuidas PHP SOS konkreetselt aitab?
- Koosseisu kaardistamine: Loetleme SAPI kaupa kõik laaditud laiendused koos päritolu ja versiooniga.
- Väljakoristamine: Sobitame loetelu teie rakenduse vajadusega ja deaktiveerime üleliigse pärast testi.
- Uuendamine: Serveri karastamise raames viime PHP ja kõik kolmandate osapoolte laiendused hooldatud seisu.
- Kontroll pärast uuendusi: Kontrollime, et pärast iga PHP uuendust on kõik vajalikud moodulid jälle laaditud.
Korduma kippuvad küsimused
Mis vahe on extension'il ja zend_extension'il?
Direktiiviga extension laadib PHP tavalisi laiendusi nagu andmebaasidraiverid. Direktiiviga zend_extension laaditakse käsiraamatu järgi Zend-laiendusi, mis sekkuvad mootorisse sügavamalt, näiteks OPcache või Xdebug. Mõlemad direktiivid tohivad olla ainult failis php.ini.
Kuidas ma näen, millised laiendused on laaditud?
Käsureal käsuga php -m, veebisaidi jaoks funktsiooniga get_loaded_extensions() ajutises kontrollifailis või vastava versiooni käsuga php-fpm -m. Arvestage, et CLI ja veebi-SAPI võivad laadida erinevaid laiendusi.
Mis on PECL ja mis on PIE?
PECL on PHP laienduste register, mida pakutakse PEAR paketisüsteemi kaudu. PHP käsiraamatu järgi on PECL kasutuselt kõrvaldatud; soovitatakse hoopis PHP Installer for Extensions'it (PIE).
Kas laienduse väljalülitamine sulgeb PHP2Shelli?
Ei. PHP2Shelli augud asuvad PHP tuumas, mitte väljalülitatavas laiendis. Vähem laiendusi vähendab ründepinda üldiselt, kuid ei asenda uuendust parandatud versioonile.