# PHP op de opdrachtregel (CLI)

> PHP CLI uitgelegd: verschillen met de webversie, belangrijke opties als -l, -m en --ini, cronjobs, ingebouwde webserver en waarom php -v vaak misleidt.

Bron: https://phpsos.de/nl/php/php-cli/  
Stand: 25-10-2026  
Aanbieder: PHP SOS, PHP-noodhulp en serverbeveiliging. Directe hulp via WhatsApp: https://wa.me/491736494914?text=Hallo%20PHP%20SOS%2C%20wij%20hebben%20hulp%20nodig%20met%20onze%20PHP-server.%20Bedrijf%3A%20%E2%80%A6%20Website%3A%20%E2%80%A6

**Kort gezegd:** De PHP CLI (Command Line Interface) is de variant van PHP voor de opdrachtregel. Ze voert scripts uit zonder webserver, bijvoorbeeld voor cronjobs, Composer of onderhoudstaken. Ze heeft eigen standaardwaarden, vaak een eigen php.ini en soms zelfs een andere versie dan de website. Daarom is `php -v` geen betrouwbaar bewijs dat de website na PHP2Shell is gepatcht.

## Wat is de PHP CLI?

De PHP-handleiding noemt twee hoofdtoepassingen van PHP: scripts voor websites en scripts op de opdrachtregel. Voor dat laatste is er een eigen SAPI met de naam `cli`. Ze heeft geen webserver of browser nodig, alleen de PHP-interpreter. Volgens de handleiding is ze bijzonder geschikt voor taken die regelmatig via cron onder Linux of via de taakplanner onder Windows draaien.

Typische voorbeelden in de bedrijfspraktijk: nachtelijke imports in de webshop, nieuwsbriefverzending, opschonen van caches, updates via Composer of de opdrachtregelhulpmiddelen van CMS'en zoals WP-CLI of de Symfony-console. Onder Windows heet het bestand `php.exe`, de CGI-variant `php-cgi.exe`.

Anders dan PHP-FPM is de CLI geen dienst. Elke aanroep start een nieuw proces, leest volgens de handleiding de configuratie opnieuw in en eindigt als het script klaar is. Een herstart na een update is daarom niet nodig. Uitzonderingen zijn langlopende processen die via de CLI worden gestart, zoals wachtrijworkers van frameworks of daemons onder systemd of Supervisor. Ze draaien dagenlang met de eenmaal geladen interpreter en moeten na een PHP-update net zo opnieuw worden gestart als webworkers.

Voor directie en projectleiding betekent dit: ook achtergrondtaken horen in de inventaris en in elk updateplan.

## Waarin verschilt de CLI van de webversie?

De CLI overschrijft volgens de handleiding enkele instellingen vast. Ze zijn niet via de php.ini te wijzigen, alleen tijdens de uitvoering met `ini_set()`:

| Directive | Waarde in de CLI | Reden volgens de handleiding |
|---|---|---|
| `html_errors` | uit | HTML-tags storen in de terminal |
| `implicit_flush` | aan | uitvoer moet direct verschijnen |
| `max_execution_time` | 0 (onbeperkt) | opdrachtregelscripts draaien vaak lang |
| `register_argc_argv` | aan | scripts krijgen altijd `$argc` en `$argv` |
| `output_buffering` | uit | vast ingesteld, bufferfuncties blijven bruikbaar |
| `max_input_time` | uit | de CLI kent geen GET, POST of uploads |

Een ander verschil: de CLI wisselt niet naar de map van het script. Wie `php -f ordner/skript.php` vanuit `/tmp` aanroept, blijft in `/tmp` werken. Relatieve paden in cronjobs zijn daarom een veelvoorkomende bron van fouten.

Een klein script dat alleen op de opdrachtregel mag draaien:

```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");
```

De controle op `PHP_SAPI` voorkomt dat een onderhoudsscript via de browser wordt geactiveerd als het per ongeluk in de webmap staat. De handleiding adviseert uitdrukkelijk de SAPI zo te controleren in plaats van te vertrouwen op de aanwezigheid van `$argv`.

## De belangrijkste opties van de PHP CLI

De volgende opties komen uit het optieoverzicht van de PHP-handleiding en zijn voor beheerders bijzonder nuttig:

1. **`php -v`** toont het versienummer van de CLI.
2. **`php --ini`** toont welke configuratiebestanden worden geladen.
3. **`php -m`** somt de ingecompileerde en geladen modules op.
4. **`php -i`** roept `phpinfo()` aan en geeft het resultaat als tekst uit.
5. **`php -l datei.php`** controleert alleen de syntaxis (lint). Sinds PHP 8.3 ook voor meerdere bestanden tegelijk.
6. **`php -r 'code'`** voert code direct uit, zonder `<?php`.
7. **`php -d name=wert`** stelt een INI-instelling in voor deze aanroep.
8. **`php -n`** negeert de php.ini volledig.
9. **`php --ri name`** toont de configuratie van een extensie.

```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
```

## De ingebouwde webserver: alleen voor ontwikkeling

Met `php -S localhost:8000` start de CLI een kleine webserver. De voorbeelduitvoer in de handleiding noemt PHP 5.4.0 als uitgangspunt. De handleiding is eenduidig: de server dient voor ontwikkeling, is geen volwaardige webserver en mag niet in openbare netwerken en niet in productie draaien. Draait hij permanent en van buitenaf bereikbaar op een server, dan is dat een bevinding die u moet verhelpen.

## CLI, cron en beveiliging na PHP2Shell

De bekende meldingen over PHP2Shell noemen PHP-FPM, mod_php, php-cgi, FrankenPHP en LiteSpeed als getroffen uitvoeringsmodi. De CLI verwerkt geen verzoeken uit het netwerk. Voor de beveiliging is ze toch in drie opzichten belangrijk:

- **Onjuist bewijs:** `php -v` toont de CLI-versie. De website kan een andere versie gebruiken, en backports van distributies veranderen het getoonde nummer vaak niet. Hoe u de stand juist aantoont, staat onder [PHP-versie en patchstand controleren](https://phpsos.de/nl/php2shell/php-version-pruefen/) en in het artikel [Waarom php -v hetzelfde nummer toont](https://phpsos.de/nl/blog/php-v-zeigt-alte-nummer/).
- **Persistentie via cron:** Aanvallers gebruiken na een inbraak graag cronjobs die regelmatig een PHP-script starten. Aanwijzingen voor het zoeken geeft [Verborgen cronjobs als achterdeur herkennen](https://phpsos.de/nl/blog/cronjobs-als-hintertuer/).
- **Hetzelfde pakket:** De CLI komt meestal uit dezelfde pakketbron als PHP-FPM en hoort in de update.

## Hoe helpt PHP SOS concreet?

- **Versies vergelijken:** Wij vergelijken CLI- en webstand en bewijzen welke versie uw website werkelijk uitlevert.
- **Cronjobs controleren:** Wij sommen alle geplande PHP-taken van alle gebruikers op en koppelen ze aan hun toepassingen.
- **Onderhoud beveiligen:** Wij verplaatsen onderhoudsscripts uit de webmap en stellen SAPI-controles in.
- **Duurzaam begeleiden:** In het [beveiligingsonderhoudscontract](https://phpsos.de/nl/leistungen/security-wartungsvertrag/) houden wij CLI, web-SAPI en cronjobs gezamenlijk actueel.


## Veelgestelde vragen

**Toont php -v de versie van mijn website?**  
Niet per se. php -v toont de versie van de opdrachtregelvariant. De website kan via een andere PHP-FPM-versie of een Apache-module draaien. Voor de website telt de stand van de web-SAPI, die u via de dienst of een kortstondig testbestand vaststelt.

**Waarom draaien CLI-scripts onbeperkt lang?**  
Volgens de PHP-handleiding zet de CLI max_execution_time vast op 0, dus onbeperkt, omdat scripts op de opdrachtregel vaak lange taken uitvoeren. De looptijd kunt u beperken via het script zelf of via hulpmiddelen als timeout.

**Mag ik de ingebouwde webserver php -S productief gebruiken?**  
Nee. De handleiding beschrijft hem als hulpmiddel voor ontwikkeling, niet als volwaardige webserver, en raadt gebruik in openbare netwerken en in productie af. Voor live-systemen horen Apache, Nginx of LiteSpeed met PHP-FPM ervoor.

**Is OPcache op de opdrachtregel actief?**  
Standaard niet. opcache.enable_cli staat volgens de handleiding op 0. Voor korte scripts levert de cache toch weinig op, omdat elke aanroep een nieuw proces is.

## Bronnen

- [PHP-handleiding: PHP op de opdrachtregel](https://www.php.net/manual/en/features.commandline.php)
- [PHP-handleiding: verschillen van de CLI-SAPI](https://www.php.net/manual/en/features.commandline.differences.php)
- [PHP-handleiding: CLI-opties](https://www.php.net/manual/en/features.commandline.options.php)
- [PHP-handleiding: ingebouwde webserver](https://www.php.net/manual/en/features.commandline.webserver.php)
