PHP ist weit mehr als eine Sprache für Webseiten. Mit dem CLI-Modus (Command Line Interface) lassen sich PHP-Skripte direkt im Terminal ausführen, ohne dass ein Webserver wie Apache oder Nginx benötigt wird. Das eröffnet Möglichkeiten für Cronjobs, Build-Skripte, Datenbank-Migrationen und Automatisierungsaufgaben aller Art. Dieses Tutorial erklärt die grundlegende Nutzung von PHP-CLI, zeigt das Übergeben von Argumenten, beleuchtet die Unterschiede zum Webserver-Modus und stellt praktische Einsatzszenarien vor.

Los geht es mit den Grundlagen: Was genau ist die CLI-SAPI und worin unterscheidet sie sich von der Webserver-Ausführung?
Was ist PHP-CLI?
PHP verfügt über verschiedene Schnittstellen (SAPIs), über die der Interpreter aufgerufen werden kann. Die bekannteste ist das Apache-Modul apache2handler, das PHP-Code bei HTTP-Anfragen verarbeitet. Daneben existiert die CLI-SAPI, die PHP als eigenständiges Kommandozeilenprogramm bereitstellt.
flowchart TD
A["PHP-Skript"] --> B{"Modus?"}
B -->|"Webserver"| C["Apache / Nginx
$_GET, $_POST
Zeitlimit aktiv
Ausgabe an Browser"]
B -->|"CLI"| D["Kommandozeile
$argv, $argc
Kein Zeitlimit
Ausgabe an Terminal"]
Im CLI-Modus entfällt der gesamte HTTP-Kontext. Stattdessen kommuniziert PHP über STDIN, STDOUT und STDERR mit dem Terminal. Das macht PHP-CLI ideal für Aufgaben, die keine Browserausgabe erfordern, etwa das Verarbeiten von Dateien, das Ausführen geplanter Aufgaben oder das Erstellen eigener Kommandozeilenwerkzeuge.
PHP-Version prüfen und erste Schritte
Bevor ein Skript ausgeführt wird, empfiehlt sich ein kurzer Check der installierten PHP-Version und der verfügbaren Module.
<?php
/* Terminal-Befehle (ohne PHP-Tags im Terminal eingeben): */
/* php -v Version anzeigen */
/* php -m Geladene Module auflisten */
/* php --ini Verwendete php.ini anzeigen */
/* Einzeiler direkt im Terminal ausfuehren: */
/* php -r "echo 'Hallo von PHP-CLI' . PHP_EOL;" */
/* Skriptdatei ausfuehren: */
/* php skript.php */
echo php_sapi_name() . PHP_EOL;
/* Ausgabe: cli */
Der Befehl php -v zeigt die installierte Version an. Mit php -m lassen sich alle geladenen Erweiterungen auflisten. Der Befehl php --ini verrät, welche Konfigurationsdatei geladen wird. Wichtig ist hierbei, dass PHP-CLI eine eigene php.ini verwenden kann, die sich von der Webserver-Variante unterscheidet. Die Funktion php_sapi_name() gibt innerhalb eines Skripts den aktuellen SAPI-Modus zurück, im Terminal also cli.
Argumente an PHP-Skripte übergeben
Kommandozeilenskripte benötigen häufig Parameter, um flexibel einsetzbar zu sein. PHP stellt dafür die Variablen $argc und $argv bereit.
<?php
/* Aufruf: php gruss.php Max */
if ($argc < 2) {
echo "Bitte einen Namen angeben." . PHP_EOL;
exit(1);
}
echo "Hallo, " . $argv[1] . "!" . PHP_EOL;
Die Variable $argv enthält alle Argumente als Array. Der erste Eintrag $argv[0] ist immer der Name des Skripts selbst, ab $argv[1] folgen die übergebenen Parameter. Die Variable $argc gibt die Gesamtzahl der Argumente an. Für komplexere Szenarien mit benannten Optionen bietet PHP die Funktion getopt().
<?php
/* Aufruf: php export.php --format=csv --limit=100 */
$optionen = getopt('', ['format:', 'limit:']);
$format = $optionen['format'] ?? 'json';
$limit = (int) ($optionen['limit'] ?? 50);
echo "Export: $format, Limit: $limit" . PHP_EOL;
Der Doppelpunkt nach dem Optionsnamen signalisiert, dass die Option einen Wert erwartet. Ohne Doppelpunkt wird die Option als boolescher Schalter behandelt. Der Null-Coalescing-Operator ?? setzt dabei Standardwerte, falls eine Option nicht angegeben wurde. So entstehen flexible Skripte, die sich wie professionelle Kommandozeilenwerkzeuge verhalten.
Unterschiede zwischen CLI und Webserver-Modus
Der CLI-Modus unterscheidet sich in mehreren Punkten grundlegend von der Webserver-Ausführung. Diese Unterschiede zu kennen verhindert typische Fehler bei der Entwicklung von CLI-Skripten.
<?php
/* CLI-spezifische Einstellungen pruefen */
echo "SAPI: " . php_sapi_name() . PHP_EOL;
echo "max_execution_time: " . ini_get('max_execution_time') . PHP_EOL;
/* Ausgabe im CLI-Modus: 0 (unbegrenzt) */
/* HTTP-Superglobals sind im CLI-Modus leer */
var_dump($_GET);
/* array(0) {} */
var_dump($_POST);
/* array(0) {} */
Im CLI-Modus ist max_execution_time standardmäßig auf 0 gesetzt, was unbegrenzte Laufzeit bedeutet. Die Superglobals $_GET, $_POST und die HTTP-Teile von $_SERVER sind leer, da kein HTTP-Request existiert. Die Ausgabe geht an STDOUT statt an einen Browser, HTML-Tags werden also nicht interpretiert. Außerdem verwendet PHP-CLI möglicherweise eine andere php.ini als der Webserver, was zu unterschiedlichem Verhalten bei Erweiterungen und Einstellungen führen kann. Relative Pfadangaben im Skript beziehen sich auf das aktuelle Arbeitsverzeichnis des Terminals, nicht auf das Verzeichnis der Skriptdatei.
Shebang-Zeile für ausführbare PHP-Skripte
Auf Linux und macOS lässt sich ein PHP-Skript direkt ausführbar machen, sodass der Aufruf ohne expliziten php-Befehl funktioniert. Dafür wird eine Shebang-Zeile an den Anfang der Datei gesetzt.
#!/usr/bin/env php
<?php
/* Datei: backup.php */
/* Ausfuehrbar machen: chmod +x backup.php */
/* Aufruf: ./backup.php */
$quellverzeichnis = $argv[1] ?? '/var/www/html';
$zeitstempel = date('Y-m-d_H-i-s');
$archivname = "backup_$zeitstempel.tar.gz";
echo "Erstelle Backup von $quellverzeichnis ..." . PHP_EOL;
exec("tar -czf /tmp/$archivname $quellverzeichnis 2>&1", $ausgabe, $exitcode);
if ($exitcode === 0) {
echo "Backup erfolgreich: /tmp/$archivname" . PHP_EOL;
} else {
echo "Fehler beim Backup:" . PHP_EOL;
echo implode(PHP_EOL, $ausgabe) . PHP_EOL;
exit(1);
}
Die Zeile #!/usr/bin/env php teilt dem Betriebssystem mit, welcher Interpreter die Datei ausführen soll. Der Befehl chmod +x backup.php setzt das Ausführungsrecht. Danach lässt sich das Skript mit ./backup.php starten. Auf Windows ist diese Methode nicht verfügbar, dort muss PHP immer explizit mit php skript.php aufgerufen werden.
Praxisbeispiele für PHP-CLI
PHP-CLI eignet sich für zahlreiche Aufgaben im Entwicklungsalltag. Die folgenden Beispiele zeigen typische Einsatzszenarien.
Cronjob mit PHP
Wiederkehrende Aufgaben lassen sich über Cronjobs automatisieren. Ein Crontab-Eintrag ruft das PHP-Skript in regelmäßigen Abständen auf.
<?php
/* Crontab-Eintrag (alle 6 Stunden):
0 6 * * * /usr/bin/php /var/www/scripts/cleanup.php */
$logverzeichnis = '/var/log/app';
$maxAlter = 30;
$dateien = glob("$logverzeichnis/*.log");
$geloescht = 0;
foreach ($dateien as $datei) {
$alter = (time() - filemtime($datei)) / 86400;
if ($alter > $maxAlter) {
unlink($datei);
$geloescht++;
}
}
echo "$geloescht Logdateien geloescht." . PHP_EOL;
Der volle Pfad zum PHP-Interpreter ist im Crontab wichtig, da Cronjobs eine minimale Umgebung ohne den üblichen PATH verwenden. Das Skript löscht in diesem Beispiel Logdateien, die älter als 30 Tage sind.
STDIN lesen
CLI-Skripte können auch interaktiv mit dem Benutzer kommunizieren, indem sie Eingaben über STDIN entgegennehmen.
<?php
echo "Wie heisst du? ";
$name = trim(fgets(STDIN));
echo "Welche Sprache lernst du? ";
$sprache = trim(fgets(STDIN));
echo "Willkommen, $name! Viel Erfolg mit $sprache." . PHP_EOL;
Die Funktion fgets(STDIN) liest eine Zeile von der Standardeingabe. Mit trim() werden Zeilenumbrüche am Ende entfernt. So lassen sich einfache interaktive Werkzeuge oder Installationsassistenten bauen.
PHP-CLI auf verschiedenen Betriebssystemen
Die Installation von PHP-CLI unterscheidet sich je nach Plattform. Auf Ubuntu und Debian installiert der Befehl sudo apt install php-cli das CLI-Paket. Auf macOS lässt sich PHP über Homebrew mit brew install php einrichten. Unter Windows wird PHP als ZIP-Archiv von der offiziellen Seite heruntergeladen, entpackt und der Pfad zur php.exe in die Systemumgebungsvariable PATH eingetragen. Auf allen Plattformen bestätigt php -v die erfolgreiche Installation.
Fazit
PHP-CLI erweitert die Einsatzmöglichkeiten von PHP weit über den Webserver hinaus. Skripte lassen sich direkt im Terminal ausführen, Argumente werden über $argv und getopt() entgegengenommen, und die Shebang-Zeile macht Skripte auf Linux und macOS direkt ausführbar. Der CLI-Modus kennt keine Zeitbegrenzung, arbeitet ohne HTTP-Kontext und nutzt möglicherweise eine eigene php.ini. Für Cronjobs, Automatisierung und Build-Prozesse ist PHP-CLI damit ein unverzichtbares Werkzeug im Entwicklungsalltag.