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:
php -vnäyttää CLI:n versionumeron.php --ininäyttää, mitkä konfiguraatiotiedostot ladataan.php -mluettelee käännetyt ja ladatut moduulit.php -ikutsuuphpinfo()-funktiota ja tulostaa tuloksen tekstinä.php -l datei.phptarkistaa vain syntaksin (lint). PHP 8.3:sta lähtien myös usealle tiedostolle kerralla.php -r 'code'suorittaa koodin suoraan ilman<?php-merkintää.php -d name=wertasettaa INI-asetuksen tätä kutsua varten.php -nohittaa php.ini-tiedoston kokonaan.php --ri namenä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:
- Väärä todiste:
php -vnä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 ja artikkelissa Miksi php -v näyttää saman numeron. - 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.
- 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 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.