Ajankohtainen tilanne: PHP2Shell. Kaksi kriittistä PHP-haavoittuvuutta (CVSS 9.2) sallii haittakoodin suorittamisen ilman kirjautumista. Korjaukset 21.10.2026 alkaen.Mitä nyt on tehtävä →

PHP komentorivillä (CLI)

PHP CLI suorittaa komentosarjoja ilman verkkopalvelinta, esimerkiksi cron-tehtäviin ja ylläpitoon. Se käyttäytyy eri tavalla kuin verkkoversio eikä usein näytä verkkosivustonne käyttämää tilaa.

Tilanne Lukuaika 4 minPHP-tietoa

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
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.
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:

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 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

Pikayhteys

Jokainen tunti on tärkeä. Kirjoittakaa meille nyt.

Kuvatkaa lyhyesti järjestelmä, PHP-versio ja havainnot. Otamme yhteyttä, selvitämme tilanteen ja työskentelemme etänä, kunnes tapaus on käsitelty loppuun ja dokumentoitu.

Pikaapu