# PHP komentorivillä (CLI)

> PHP CLI selitettynä: erot verkkoversioon, valinnat -l, -m ja --ini, cron-tehtävät, sisäänrakennettu verkkopalvelin ja miksi php -v usein johtaa harhaan.

Lähde: https://phpsos.de/fi/php/php-cli/  
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 CLI (Command Line Interface) on PHP:n variantti komentoriville. Se suorittaa komentosarjoja ilman verkkopalvelinta, esimerkiksi cron-tehtäviin, Composeriin tai ylläpitotehtäviin. Sillä on omat oletusarvonsa, usein oma php.ini ja joskus jopa eri versio kuin verkkosivustolla. Siksi `php -v` ei ole luotettava todiste siitä, että verkkosivusto on PHP2Shellin jälkeen korjattu.

## Mikä PHP CLI on?

PHP-käsikirja mainitsee PHP:lle kaksi pääkäyttöaluetta: komentosarjat verkkosivustoille ja komentosarjat komentorivillä. Jälkimmäistä varten on oma SAPI nimeltä `cli`. Se ei tarvitse verkkopalvelinta eikä selainta, vain PHP-tulkin. Käsikirjan mukaan se sopii erityisesti tehtäviin, joita ajetaan säännöllisesti Cronilla Linuxissa tai tehtäväajastuksella Windowsissa.

Tyypillisiä esimerkkejä yritysarjesta: verkkokaupan yölliset tuonnit, uutiskirjeiden lähetys, välimuistien puhdistus, päivitykset Composerilla tai CMS-järjestelmien komentorivityökalut, kuten WP-CLI tai Symfony-konsoli. Windowsissa tiedosto on `php.exe`, CGI-variantti `php-cgi.exe`.

Toisin kuin PHP-FPM, CLI ei ole palvelu. Jokainen kutsu käynnistää uuden prosessin, lukee käsikirjan mukaan konfiguraation uudelleen ja päättyy, kun komentosarja on valmis. Uudelleenkäynnistys päivityksen jälkeen ei siksi ole tarpeen. Poikkeuksia ovat pitkään käynnissä olevat prosessit, jotka käynnistetään CLI:llä, esimerkiksi kehysten jonotyöntekijät tai daemonit systemd:n tai Supervisorin alla. Ne toimivat päiväkausia kerran ladatulla tulkilla ja on käynnistettävä PHP-päivityksen jälkeen uudelleen aivan kuten verkkoworkerit.

Johdolle ja projektipäällikölle tämä tarkoittaa: myös taustatehtävät kuuluvat luetteloon ja jokaiseen päivityssuunnitelmaan.

## Miten CLI eroaa verkkoversiosta?

CLI ylikirjoittaa käsikirjan mukaan joitakin asetuksia kiinteästi. Niitä ei voi muuttaa php.ini-tiedostossa, vain ajon aikana `ini_set()`-funktiolla:

| Direktiivi | Arvo CLI:ssä | Perustelu käsikirjan mukaan |
|---|---|---|
| `html_errors` | pois | HTML-tagit häiritsevät päätteessä |
| `implicit_flush` | päällä | tulosteiden on tultava heti näkyviin |
| `max_execution_time` | 0 (rajaton) | komentorivin komentosarjat kestävät usein pitkään |
| `register_argc_argv` | päällä | komentosarjat saavat aina `$argc` ja `$argv` |
| `output_buffering` | pois | kiinteästi asetettu, puskurifunktiot pysyvät käytettävissä |
| `max_input_time` | pois | CLI ei tunne GET-, POST- tai latauksia |

Toinen ero: CLI ei vaihda komentosarjan hakemistoon. Joka kutsuu `php -f ordner/skript.php` hakemistosta `/tmp`, jatkaa työskentelyä hakemistossa `/tmp`. Suhteelliset polut cron-tehtävissä ovat siksi yleinen virhelähde.

Pieni komentosarja, jonka on tarkoitus toimia vain komentorivillä:

```php
<?php
if (PHP_SAPI !== 'cli') {
    http_response_code(403);
    exit('Nur für die Kommandozeile.');
}
$tage = (int) ($argv[1] ?? 30);
$grenze = time() - $tage * 86400;
$alt = 0;
foreach (glob(__DIR__ . '/cache/*.tmp') ?: [] as $datei) {
    if (filemtime($datei) < $grenze) { $alt++; }
}
fwrite(STDOUT, "Dateien älter als $tage Tage: $alt\n");
```

`PHP_SAPI`-tarkistus estää sen, että ylläpitokomentosarja käynnistyy selaimen kautta, jos se on vahingossa verkkohakemistossa. Käsikirja neuvoo nimenomaan tarkistamaan SAPI:n näin sen sijaan, että luottaisi `$argv`-muuttujan olemassaoloon.

## PHP CLI:n tärkeimmät valinnat

Seuraavat valinnat ovat PHP-käsikirjan valintayleiskatsauksesta ja erityisen hyödyllisiä ylläpitäjille:

1. **`php -v`** näyttää CLI:n versionumeron.
2. **`php --ini`** näyttää, mitkä konfiguraatiotiedostot ladataan.
3. **`php -m`** luettelee käännetyt ja ladatut moduulit.
4. **`php -i`** kutsuu `phpinfo()`-funktiota ja tulostaa tuloksen tekstinä.
5. **`php -l datei.php`** tarkistaa vain syntaksin (lint). PHP 8.3:sta lähtien myös usealle tiedostolle kerralla.
6. **`php -r 'code'`** suorittaa koodin suoraan ilman `<?php`-merkintää.
7. **`php -d name=wert`** asettaa INI-asetuksen tätä kutsua varten.
8. **`php -n`** ohittaa php.ini-tiedoston kokonaan.
9. **`php --ri name`** näyttää laajennuksen konfiguraation.

```bash
php --ini
php -m | grep -i -E "opcache|sodium|pdo"
php --ri session | grep upload_progress
php -l src/Controller.php src/Model.php
```

## Sisäänrakennettu verkkopalvelin: vain kehitykseen

Komennolla `php -S localhost:8000` CLI käynnistää pienen verkkopalvelimen. Käsikirjan esimerkkitulosteessa lähtökohtana mainitaan PHP 5.4.0. Käsikirja on yksiselitteinen: palvelin on tarkoitettu kehitykseen, se ei ole täysipainoinen verkkopalvelin, eikä sitä pidä käyttää julkisissa verkoissa eikä tuotannossa. Jos se toimii palvelimella pysyvästi ja ulkopuolelta tavoitettavissa, se on havainto, joka kannattaa korjata.

## CLI, cron ja tietoturva PHP2Shellin jälkeen

Tunnetuissa PHP2Shell-tiedotteissa mainitaan PHP-FPM, mod_php, php-cgi, FrankenPHP ja LiteSpeed koskeneina ajotapoina. CLI ei käsittele pyyntöjä verkosta. Tietoturvan kannalta se on silti tärkeä kolmella tavalla:

- **Väärä todiste:** `php -v` näyttää CLI-version. Verkkosivusto voi käyttää eri versiota, ja jakelun backportit eivät usein muuta näytettyä numeroa. Miten tilan osoittaa oikein, kerrotaan sivulla [PHP-version ja korjaustilan tarkistus](https://phpsos.de/fi/php2shell/php-version-pruefen/) ja artikkelissa [Miksi php -v näyttää saman numeron](https://phpsos.de/fi/blog/php-v-zeigt-alte-nummer/).
- **Pysyvyys cronin kautta:** Hyökkääjät käyttävät murron jälkeen mielellään cron-tehtäviä, jotka käynnistävät PHP-komentosarjan säännöllisesti. Hakuvinkkejä antaa [Piilotettujen cron-tehtävien tunnistaminen takaovena](https://phpsos.de/fi/blog/cronjobs-als-hintertuer/).
- **Sama paketti:** CLI tulee yleensä samasta pakettilähteestä kuin PHP-FPM, ja se kuuluu päivitykseen.

## Miten PHP SOS auttaa konkreettisesti?

- **Versioiden vertailu:** Vertaamme CLI:n ja verkon tilaa ja osoitamme, minkä version verkkosivustonne todella tarjoaa.
- **Cron-tehtävien tarkistus:** Luettelemme kaikkien käyttäjien kaikki ajastetut PHP-tehtävät ja yhdistämme ne sovelluksiinsa.
- **Ylläpidon turvaaminen:** Siirrämme ylläpitokomentosarjat pois verkkohakemistosta ja lisäämme SAPI-tarkistukset.
- **Jatkuva huolto:** [Tietoturvahuoltosopimuksessa](https://phpsos.de/fi/leistungen/security-wartungsvertrag/) pidämme CLI:n, verkko-SAPI:n ja cron-tehtävät ajan tasalla yhdessä.


## Usein kysytyt kysymykset

**Näyttääkö php -v verkkosivustoni version?**  
Ei välttämättä. php -v näyttää komentorivivariantin version. Verkkosivusto voi toimia eri PHP-FPM-versiolla tai Apache-moduulilla. Verkkosivuston kannalta ratkaisee verkko-SAPI:n tila, jonka selvittää palvelun kautta tai tilapäisellä tarkistustiedostolla.

**Miksi CLI-komentosarjat voivat toimia rajattoman pitkään?**  
PHP-käsikirjan mukaan CLI asettaa max_execution_time-arvon kiinteästi 0:ksi eli rajattomaksi, koska komentorivin komentosarjat suorittavat usein pitkiä tehtäviä. Suoritusaikaa voi rajoittaa komentosarjalla itsellään tai työkaluilla kuten timeout.

**Saanko käyttää sisäänrakennettua verkkopalvelinta php -S tuotannossa?**  
Et. Käsikirja kuvaa sen kehityksen apuvälineeksi, ei täysipainoiseksi verkkopalvelimeksi, ja neuvoo olemaan käyttämättä sitä julkisissa verkoissa ja tuotannossa. Tuotantojärjestelmiin kuuluvat Apache, Nginx tai LiteSpeed ja PHP-FPM.

**Onko OPcache aktiivinen komentorivillä?**  
Ei oletuksena. opcache.enable_cli on käsikirjan mukaan 0. Lyhyille komentosarjoille välimuisti ei tuo juuri mitään, koska jokainen kutsu on uusi prosessi.

## Lähteet

- [PHP-käsikirja: PHP komentorivillä](https://www.php.net/manual/en/features.commandline.php)
- [PHP-käsikirja: CLI-SAPI:n erot](https://www.php.net/manual/en/features.commandline.differences.php)
- [PHP-käsikirja: CLI-valinnat](https://www.php.net/manual/en/features.commandline.options.php)
- [PHP-käsikirja: sisäänrakennettu verkkopalvelin](https://www.php.net/manual/en/features.commandline.webserver.php)
