# PHP-laajennusten (extensions) ymmärtäminen

> PHP-laajennukset selitettynä: Core-, Bundled- ja PECL-laajennukset, extension ja zend_extension, php -m ja miksi vähemmän moduuleja on turvallisempaa.

Lähde: https://phpsos.de/fi/php/php-erweiterungen/  
Tilanne: 25.10.2026  
Palveluntarjoaja: PHP SOS, PHP-hätäapu ja palvelimen tietoturva. Pikaapu WhatsAppilla: https://wa.me/491736494914?text=Hei%20PHP%20SOS%2C%20tarvitsemme%20apua%20PHP-palvelimemme%20kanssa.%20Yritys%3A%20%E2%80%A6%20Verkkosivusto%3A%20%E2%80%A6

**Lyhyesti:** PHP-laajennukset (extensions) ovat C-kielellä kirjoitettuja moduuleja, jotka lisäävät PHP:hen toimintoja, esimerkiksi tietokanta-ajurit (PDO), salauksen (Sodium, OpenSSL) tai tavukoodivälimuisti OPcachen. PHP-käsikirja erottaa Core-, Bundled-, External- ja PECL-laajennukset. Ne ladataan php.ini-tiedoston `extension`- tai `zend_extension`-direktiivillä. Jokainen laajennus toimii PHP-prosessissa sen oikeuksilla. Siksi pätee: lataa vain tarvittava ja päivitä PHP:n mukana.

## Mitä PHP-laajennukset ovat?

PHP:n ydin, [Zend Engine](https://phpsos.de/fi/php/zend-engine/), osaa suorittaa koodia, mutta suuri osa siitä, mitä sovellukset tarvitsevat, on laajennuksissa. Ne on kirjoitettu C-kielellä ja joko käännetty kiinteästi PHP:hen tai ladataan käynnistyksessä jaettuna kirjastona (`.so` Linuxissa, `.dll` Windowsissa).

Päättäjälle tärkeää: laajennukset eivät ole sovelluksen lisäosia vaan osa PHP-ajoympäristöä. Hosting-yritys tai palvelimen ylläpitäjä asentaa ne, ei verkkotoimisto CMS:ssä. Jos laajennus puuttuu, sovellus ilmoittaa yleensä virheestä asennuksessa tai päivityksessä.

Yhtä tärkeä on ero Composer-paketteihin. Composer asentaa kirjastoja, jotka on kirjoitettu PHP:llä ja jotka sijaitsevat projektikansiossa, esimerkiksi sähköposti- tai PDF-paketin. Laajennukset sen sijaan ovat käännettyä koodia, joka ladataan PHP:n käynnistyessä ja joka koskee kaikkia palvelimen sovelluksia. Monet Composer-paketit edellyttävät tiettyjä laajennuksia ja merkitsevät sen `composer.json`-tiedostoonsa merkinnöillä kuten `ext-intl` tai `ext-sodium`. Joka haluaa tarkistaa, löytääkö projekti kaikki tarvittavat laajennukset, voi ajaa projektikansiossa komennon `composer check-platform-reqs`.

## Minkälaisia laajennuksia on?

PHP-käsikirja jakaa laajennukset neljään ryhmään:

| Ryhmä | Merkitys käsikirjan mukaan | Esimerkkejä käsikirjasta |
|---|---|---|
| Core | osa PHP:n ydintä, ei sammutettavissa | Arrays, Date/Time, Hash, JSON, PCRE, SPL, Strings |
| Bundled | toimitetaan PHP:n mukana | BC Math, Ctype, Fileinfo, Filter, GD, intl, mbstring, PDO, Sessions |
| External | toimitetaan PHP:n mukana, tarvitsevat ulkoisia kirjastoja | cURL, DOM, GMP, LDAP, OpenSSL, Sodium, Zip |
| PECL | saatavilla PECL:n kautta, osin ulkoisten kirjastojen kanssa | APCu, Memcached, MongoDB, Yaml |

Luokittelu voi muuttua. PHP 8.4:n myötä julkaisusivun mukaan laajennukset IMAP, OCI8, PDO_OCI ja pspell poistettiin toimituksesta ja siirrettiin PECL:iin. Joka niitä käyttää, tarvitsee päivityksen jälkeen erillisen asennuksen, jota on myös huollettava.

## Miten laajennukset ladataan?

Jaetut laajennukset ladataan käsikirjan mukaan php.ini-tiedoston `extension`-direktiivillä; Zend-laajennukset, jotka puuttuvat moottoriin syvemmin, `zend_extension`-direktiivillä. Molemmat saavat olla vain php.ini-tiedostossa. Hakemiston määrittää `extension_dir`, jolle käsikirja suosittelee absoluuttista polkua.

```ini
; tavalliset laajennukset
extension=pdo_mysql
extension=sodium
extension=intl

; Zend-laajennus: OPcache (lataa ennen Xdebugia, jos molemmat ovat aktiivisia)
zend_extension=opcache
```

Jakelut, kuten Debian ja Ubuntu, tallentavat jokaiselle laajennukselle oman pienen `.ini`-tiedostonsa hakuhakemistoon, esimerkiksi polkuun `/etc/php/8.3/mods-available/`, ja aktivoivat ne SAPI:kohtaisesti komennoilla `phpenmod` ja `phpdismod`. Miten PHP lukee nämä tiedostot, selitetään sivulla [php.ini selitettynä](https://phpsos.de/fi/php/php-ini-erklaert/).

Laajennukset asennetaan yleensä paketinhallinnan kautta, esimerkiksi pakettina `php8.3-intl`. PECL-laajennukset voi rakentaa komennoilla `pecl` tai `phpize`. Käsikirjan mukaan PECL on poistumassa käytöstä; suositus on PHP Installer for Extensions (PIE). Joka rakentaa PHP:n kokonaan itse, löytää vinkkejä sivulta [PHP:n kääntäminen lähdekoodista](https://phpsos.de/fi/php/php-kompilieren/).

## Laajennusten tarkistus: mitkä on todella ladattu?

Seuraavat komennot ovat puhtaasti lukevia. Huomatkaa, että komentorivi voi ladata eri laajennukset kuin verkkosivusto.

```bash
php -m                              # CLI:n moduulit
php-fpm8.3 -m                       # PHP-FPM 8.3:n moduulit (nimi jakelusta riippuen)
php --re sodium | head -n 5         # laajennuksen funktiot
php --ri opcache                    # laajennuksen konfiguraatio
php -r 'var_dump(extension_loaded("intl"));'
```

Koodissa sovellukset tarkistavat `extension_loaded()`-funktiolla, onko laajennus olemassa, ja `get_loaded_extensions()`-funktiolla, mitkä on ladattu:

```php
<?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';
```

## Laajennukset ja tietoturva: vähemmän on enemmän

Laajennukset toimivat samassa prosessissa kuin PHP ja samoilla oikeuksilla. Laajennuksen virhe voi siksi olla yhtä vakava kuin ytimen virhe. Siitä seuraa neljä sääntöä:

1. **Lataa vain tarvittava.** Jokainen lisälaajennus kasvattaa hyökkäyspinta-alaa. Tarkistakaa luettelonne sovelluksen järjestelmävaatimuksia vasten.
2. **Päivitä PHP:n mukana.** Mukana toimitetut laajennukset tulevat PHP-päivityksen mukana. PECL- ja kolmannen osapuolen laajennukset tarvitsevat omat päivityksensä ja niiden on sovittava uuteen PHP-versioon.
3. **Kehitystyökalut eivät kuulu tuotantoon.** Debuggerit ja profiloijat, kuten Xdebug, kuuluvat vain kehitysympäristöihin.
4. **Estä funktiot kohdennetusti.** Missä laajennukset tuovat mukanaan funktioita järjestelmäkomentoja varten, auttaa [disable_functions oikein käytettynä](https://phpsos.de/fi/ratgeber/disable-functions/).

PHP2Shellissä haavoittuvuudet ovat PHP:n ytimessä, eivät laajennuksessa. Moduulien sammuttaminen ei sulje niitä; tarvitaan päivitys versioon 8.5.12, 8.4.27, 8.3.36 tai 8.2.35 ja kaikkien PHP-prosessien uudelleenkäynnistys. Päivityksen jälkeen kannattaa tarkistaa, latautuvatko kaikki laajennukset taas, sillä puuttuvat moduulit huomataan usein vasta tietyissä toiminnoissa. Miten riippuvuudet pidetään pysyvästi hallinnassa, kuvaa [Riippuvuuksien pitäminen ajan tasalla](https://phpsos.de/fi/blog/abhaengigkeiten-aktuell-halten/).

## Miten PHP SOS auttaa konkreettisesti?

- **Kartoitus:** Luettelemme SAPI:kohtaisesti kaikki ladatut laajennukset alkuperineen ja versioineen.
- **Karsinta:** Vertaamme luetteloa sovelluksenne tarpeeseen ja poistamme tarpeettoman käytöstä testin jälkeen.
- **Päivitys:** [Palvelimen koventamisen](https://phpsos.de/fi/leistungen/server-haertung/) puitteissa saatamme PHP:n ja kaikki kolmannen osapuolen laajennukset huollettuun tilaan.
- **Tarkistus päivitysten jälkeen:** Varmistamme, että jokaisen PHP-päivityksen jälkeen kaikki tarvittavat moduulit on ladattu uudelleen.


## Usein kysytyt kysymykset

**Mikä ero on extension- ja zend_extension-direktiivillä?**  
Direktiivillä extension PHP lataa tavalliset laajennukset, kuten tietokanta-ajurit. Direktiivillä zend_extension ladataan käsikirjan mukaan Zend-laajennukset, jotka puuttuvat moottoriin syvemmin, esimerkiksi OPcache tai Xdebug. Molemmat direktiivit saavat olla vain php.ini-tiedostossa.

**Miten näen, mitkä laajennukset on ladattu?**  
Komentorivillä komennolla php -m, verkkosivustolle funktiolla get_loaded_extensions() tilapäisessä tarkistustiedostossa tai komennolla php-fpm -m kyseisessä versiossa. Huomatkaa, että CLI ja verkko-SAPI voivat ladata eri laajennuksia.

**Mikä on PECL ja mikä PIE?**  
PECL on hakemisto PHP-laajennuksille, jotka toimitetaan PEAR-pakettijärjestelmän kautta. PHP-käsikirjan mukaan PECL on poistumassa käytöstä; sen sijaan suositellaan PHP Installer for Extensions -työkalua (PIE).

**Sulkeeko laajennuksen poistaminen käytöstä PHP2Shellin?**  
Ei. PHP2Shell-haavoittuvuudet ovat PHP:n ytimessä, eivät laajennuksessa, jonka voi sammuttaa. Vähemmän laajennuksia pienentää hyökkäyspinta-alaa yleisesti, mutta ei korvaa päivitystä korjattuun versioon.

## Lähteet

- [PHP-käsikirja: laajennusten luokittelu](https://www.php.net/manual/en/extensions.membership.php)
- [PHP-käsikirja: PECL-laajennusten asennus](https://www.php.net/manual/en/install.pecl.intro.php)
- [PHP-käsikirja: ydinasetukset (extension)](https://www.php.net/manual/en/ini.core.php)
- [php.net: PHP 8.4 -julkaisu](https://www.php.net/releases/8.4/en.php)
