# A PHP a parancssorban (CLI)

> PHP CLI elmagyarázva: különbségek a webes változattól, fontos kapcsolók (-l, -m, --ini), cron-feladatok, beépített webszerver, és miért téveszt meg gyakran a php -v.

Forrás: https://phpsos.de/hu/php/php-cli/  
Állapot: 2026. 10. 25.  
Szolgáltató: PHP SOS, PHP-vészhelyzeti segítség és szerverbiztonság. Azonnali segítség WhatsAppon: https://wa.me/491736494914?text=%C3%9Cdv%C3%B6zl%C3%B6m%2C%20PHP%20SOS%21%20Seg%C3%ADts%C3%A9gre%20van%20sz%C3%BCks%C3%A9g%C3%BCnk%20a%20PHP-szerver%C3%BCnkkel.%20C%C3%A9g%3A%20%E2%80%A6%20Weboldal%3A%20%E2%80%A6

**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
<?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.

```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
```

## 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](https://phpsos.de/hu/php2shell/php-version-pruefen/) oldal és a [Miért mutatja a php -v ugyanazt a számot](https://phpsos.de/hu/blog/php-v-zeigt-alte-nummer/) 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](https://phpsos.de/hu/blog/cronjobs-als-hintertuer/).
- **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](https://phpsos.de/hu/leistungen/security-wartungsvertrag/) 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

- [PHP-kézikönyv: a PHP a parancssorban](https://www.php.net/manual/en/features.commandline.php)
- [PHP-kézikönyv: a CLI SAPI különbségei](https://www.php.net/manual/en/features.commandline.differences.php)
- [PHP-kézikönyv: CLI-kapcsolók](https://www.php.net/manual/en/features.commandline.options.php)
- [PHP-kézikönyv: a beépített webszerver](https://www.php.net/manual/en/features.commandline.webserver.php)
