Aktuális helyzet: PHP2Shell. Két kritikus PHP-rés (CVSS 9,2) lehetővé teszi kártékony kód futtatását bejelentkezés nélkül. Javítások 2026. 10. 21. óta.Mi a teendő most →

A PHP a parancssorban (CLI)

A PHP CLI webszerver nélkül futtat szkripteket, például cron-feladatokhoz és karbantartáshoz. Másképp viselkedik, mint a webes változat, és gyakran nem azt az állapotot mutatja, amelyet a weboldala használ.

Állapot 5 perc olvasási időPHP-tudástár

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:

  1. php -v megmutatja a CLI verziószámát.
  2. php --ini megmutatja, mely konfigurációs fájlok töltődnek be.
  3. php -m felsorolja a beépített és betöltött modulokat.
  4. php -i meghívja a phpinfo() függvényt, és szövegként kiírja az eredményt.
  5. php -l datei.php csak a szintaxist ellenőrzi (lint). A PHP 8.3 óta több fájlra egyszerre is.
  6. php -r 'code' közvetlenül hajt végre kódot, <?php nélkül.
  7. php -d name=wert egy INI-beállítást állít be az adott híváshoz.
  8. php -n teljesen figyelmen kívül hagyja a php.ini-t.
  9. php --ri name megmutatja 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 -v a 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.

Források

Azonnali kapcsolat

Minden óra számít. Írjon nekünk most.

Ismertesse röviden a rendszert, a PHP-verziót és a megfigyelését. Jelentkezünk, tisztázzuk a helyzetet, és távolról dolgozunk, amíg az incidens le nem zárul és dokumentálva nem lesz.

Azonnali segítség