Röviden: A PHP CLI (Command Line Interface) a PHP parancssori változata. Webszerver nélkül futtat szkripteket, például cron-feladatokhoz, a Composerhez vagy karbantartási feladatokhoz. Saját alapértékei vannak, gyakran saját php.ini-je, és időnként még a weboldalétól eltérő verziója is. Ezért a php -v nem megbízható bizonyíték arra, hogy a weboldal a PHP2Shell után javítva van.
Mi a PHP CLI?
A PHP-kézikönyv a PHP két fő felhasználási területét nevezi meg: a weboldalak szkriptjeit és a parancssori szkripteket. Az utóbbihoz külön SAPI van cli néven. Nincs szüksége webszerverre és böngészőre, csak a PHP-értelmezőre. A kézikönyv szerint különösen alkalmas a Linuxon cronnal, illetve Windowson a feladatütemezővel rendszeresen futó feladatokra.
Tipikus példák a vállalati mindennapokban: éjszakai importok a webshopban, hírlevélküldés, gyorsítótárak tisztítása, frissítések a Composeren keresztül, vagy a CMS-ek parancssori eszközei, mint a WP-CLI vagy a Symfony konzol. Windows alatt a fájl neve php.exe, a CGI-változaté php-cgi.exe.
A PHP-FPM-mel ellentétben a CLI nem szolgáltatás. Minden hívás új folyamatot indít, a kézikönyv szerint újra beolvassa a konfigurációt, és véget ér, amikor a szkript elkészült. Frissítés után ezért nem szükséges újraindítás. Kivételt a CLI-ből indított hosszan futó folyamatok jelentenek, például a keretrendszerek üzenetsor-workerei vagy a systemd, illetve a Supervisor alatti démonok. Ezek napokig futnak az egyszer betöltött értelmezővel, és PHP-frissítés után ugyanúgy újra kell indítani őket, mint a webes workereket.
Ügyvezetők és projektvezetők számára ez azt jelenti: a háttérfeladatok is a leltárba és minden frissítési tervbe tartoznak.
Miben különbözik a CLI a webes változattól?
A CLI a kézikönyv szerint néhány beállítást fixen felülír. Ezek a php.ini-n keresztül nem módosíthatók, csak futásidőben az ini_set() útján:
| Direktíva | Érték a CLI-ben | Indoklás a kézikönyv szerint |
|---|---|---|
html_errors |
ki | a HTML-címkék zavarnak a terminálban |
implicit_flush |
be | a kimeneteknek azonnal meg kell jelenniük |
max_execution_time |
0 (korlátlan) | a parancssori szkriptek gyakran hosszan futnak |
register_argc_argv |
be | a szkriptek mindig megkapják a $argc és $argv értéket |
output_buffering |
ki | fixen bekötve, a pufferfüggvények használhatók maradnak |
max_input_time |
ki | a CLI nem ismer GET-et, POST-ot vagy feltöltést |
Még egy különbség: a CLI nem vált a szkript könyvtárába. Aki a php -f ordner/skript.php parancsot a /tmp-ből hívja, az /tmp-ben dolgozik tovább. A cron-feladatokban a relatív útvonalak ezért gyakori hibaforrások.
Egy kis szkript, amelynek csak a parancssorban szabad futnia:
<?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");
A PHP_SAPI ellenőrzése megakadályozza, hogy egy karbantartó szkriptet a böngészőn keresztül indítsanak el, ha véletlenül a webkönyvtárban van. A kézikönyv kifejezetten azt tanácsolja, hogy a SAPI-t így ellenőrizzék, ne a $argv meglétére hagyatkozzanak.
A PHP CLI legfontosabb kapcsolói
A következő kapcsolók a PHP-kézikönyv kapcsolóáttekintéséből származnak, és az adminisztrátoroknak különösen hasznosak:
php -vmegmutatja a CLI verziószámát.php --inimegmutatja, mely konfigurációs fájlok töltődnek be.php -mfelsorolja a beépített és betöltött modulokat.php -imeghívja aphpinfo()függvényt, és szövegként kiírja az eredményt.php -l datei.phpcsak a szintaxist ellenőrzi (lint). A PHP 8.3 óta több fájlra egyszerre is.php -r 'code'közvetlenül hajt végre kódot,<?phpnélkül.php -d name=wertegy INI-beállítást állít be az adott híváshoz.php -nteljesen figyelmen kívül hagyja a php.ini-t.php --ri namemegmutatja egy bővítmény konfigurációját.
php --ini
php -m | grep -i -E "opcache|sodium|pdo"
php --ri session | grep upload_progress
php -l src/Controller.php src/Model.php
A beépített webszerver: csak fejlesztéshez
A php -S localhost:8000 paranccsal a CLI egy kis webszervert indít. A kézikönyv példakimenete a PHP 5.4.0-t nevezi kiindulópontnak. A kézikönyv egyértelmű: a szerver fejlesztésre szolgál, nem teljes értékű webszerver, nem futhat nyilvános hálózatokon és nem éles üzemben. Ha egy szerveren tartósan és kívülről elérhetően fut, az olyan lelet, amelyet meg kell szüntetnie.
CLI, cron és biztonság a PHP2Shell után
A PHP2Shellről szóló ismert jelentések a PHP-FPM-et, a mod_php-t, a php-cgi-t, a FrankenPHP-t és a LiteSpeedet nevezik meg érintett üzemmódként. A CLI nem dolgoz fel a hálózatról érkező kéréseket. A biztonság szempontjából mégis háromféle módon fontos:
- Téves bizonyíték: A
php -va CLI verzióját mutatja. A weboldal használhat másik verziót, a disztribúciók backportjai pedig a kijelzett számot gyakran nem változtatják meg. Hogyan igazolhatja helyesen az állapotot, azt a PHP-verzió és javítási állapot ellenőrzése oldal és a Miért mutatja a php -v ugyanazt a számot cikk írja le. - Perzisztencia cronon keresztül: A támadók egy betörés után szívesen használnak olyan cron-feladatokat, amelyek rendszeresen elindítanak egy PHP-szkriptet. A kereséshez útmutatást ad a Rejtett cron-feladatok felismerése hátsó ajtóként.
- Ugyanaz a csomag: A CLI többnyire ugyanabból a csomagforrásból származik, mint a PHP-FPM, és a frissítéshez tartozik.
Hogyan segít konkrétan a PHP SOS?
- Verziók összevetése: Összehasonlítjuk a CLI és a webes állapotot, és igazoljuk, hogy a weboldala valójában melyik verziót szolgáltatja ki.
- Cron-feladatok ellenőrzése: Felsoroljuk az összes felhasználó összes ütemezett PHP-feladatát, és hozzárendeljük az alkalmazásaikhoz.
- Karbantartás biztosítása: A karbantartó szkripteket kivisszük a webkönyvtárból, és SAPI-ellenőrzéseket állítunk be.
- Tartós gondozás: A biztonsági karbantartási szerződés keretében a CLI-t, a webes SAPI-t és a cron-feladatokat együtt tartjuk naprakészen.
Gyakori kérdések
A php -v a weboldalam verzióját mutatja?
Nem feltétlenül. A php -v a parancssori változat verzióját mutatja. A weboldal futhat másik PHP-FPM-verzión vagy egy Apache-modulon. A weboldal szempontjából a webes SAPI állapota számít, amelyet a szolgáltatáson vagy egy rövid időre elhelyezett ellenőrző fájlon keresztül tud megállapítani.
Miért futnak korlátlan ideig a CLI-szkriptek?
A PHP-kézikönyv szerint a CLI a max_execution_time értékét fixen 0-ra, vagyis korlátlanra állítja, mert a parancssori szkriptek gyakran hosszú feladatokat végeznek. A futási idő magával a szkripttel vagy az olyan eszközökkel, mint a timeout, korlátozható.
Használhatom éles üzemben a beépített php -S webszervert?
Nem. A kézikönyv fejlesztési segédeszközként írja le, nem teljes értékű webszerverként, és nyilvános hálózatokon, valamint éles üzemben való használatát ellenzi. Éles rendszerekhez Apache, Nginx vagy LiteSpeed tartozik PHP-FPM-mel.
Aktív az OPcache a parancssorban?
Alapértelmezetten nem. Az opcache.enable_cli a kézikönyv szerint 0. Rövid szkriptekhez a gyorsítótár amúgy is keveset hoz, mert minden hívás új folyamat.