Kommandozeilenskripte mit PHP

Heute geht es um eine weitere tolle Facette von PHP – der Realisierung von Kommandozeilenskripten. PHP kann demnach nicht nur für die Umsetzung der reinen Webanwendung genutzt werden, sondern ebenfalls für Skripte auf Kommandozeilenebene. Damit können dann beispielsweise Cronjobs oder Update-Skripte realisiert werden, ohne das dazu weitere Programmiersprachen verwendet werden müssen. Interessant wird dieses Vorgehen gerade deshalb, weil man direkt auf die Klassen der eigentlichen Webanwendung zugreifen und diese verwenden kann.

Deshalb soll in diesem Artikel speziell auf folgende Themen eingegangen werden:

  • Parameter für Kommandozeilenskripte
  • Farbige Ausgaben
  • Benutzereingaben während des Skript-Runs
  • Hybride Skripte – Lauffähigkeit in Browser und auf der Kommandozeile

Zunächst möchte ich auf die Parameter eingehen, welche ein wichtiges Instrument zur Steuerung des Skripts darstellen können. Parameter übergibt man einem Skript auf der Kommandozeile wie folgt:

php meinSkript.php paramter1 parameter2

Auf diese Paramter kann in PHP über das Array $argv zugriffen werden, was beispielhaft wie folgt aussehen würde:

print_r($argv;)

Erzeugt wird dabei folgende Ausgabe:

Array (
  [0] => meinSkript.php
  [1] => parameter1
  [2] => parameter2
 )

Wie man sieht enthält $argv im Index 0 den Skriptnamen, bei allen weiteren Einträgen handelt es sich um die übergebenen Parameter. An dieser Stelle sei darauf hingewiesen, dass es zur guten Art gehört, für die Skripte eine Hilfe zu schreiben, welche mit einem gängigen Parameter, wie -h –help etc., erreicht werden kann.

Nun zu der Realisierung farbiger Ausgaben. Persönlich halte ich farbige Ausgaben für eine tolle Sache, da wichtige Informationen, wie erfolgreiche oder nicht erfolgreiche Durchläufe von Teilprozessen, hervorgehoben werden können. Dadurch wird einerseits die Lesbarkeit enorm erhöht, und der Nutzer wird gezielt auf wichtige Informationen aufmerksam gemacht. Zur Umsetzung dieser farbigen Ausgaben bedienen wir uns der ANSI Escape Sequenzen, welche in Linux standardmäßig funktionieren, in Windows benötigt man allerdings die ANSI.sys. Dazu soll an dieser Stelle auf ANSICON hingewiesen werden, welches die notwendige Funktionalitäten für die Windows-Konsole nach Ausführen der ansicon.exe mit dem Parameter -i zur Verfügung stellt. Die Einfärbung des Textes in den wohl wichtigsten Farben rot, grün und gelb kann in PHP wie folgt realisiert werden.

echo "\033[1;31m rot \033[0m";
echo "\033[1;32m gruen \033[0m";
echo "\033[1;33m gelb \033[0m";

\033[1;31m färbt dementsprechend den nachfolgenden Text rot, \033[0m setzt die Farbe des nachfolgenden Textes wieder auf die Standardschriftfarbe (grau) der Konsole zurück. Eine Übersicht über alle Farben und weitere Möglichkeiten in diesem Umfeld ist hier zu finden. Unter weiteren Möglichkeit ist beispielsweise auch die Einfärbung des Hintergrunds zu verstehen.

Ein weiteres wichtiges Werkzeug auf der Kommandozeile sind Benutzereingaben. Diese können nicht nur durch Parameter erfolgen, wie oben beschrieben, sondern natürlich auch durch Eingaben während der Skriptlaufzeit. Seit PHP 4.x (leider konnte ich die genaue Version der Einführung nicht herausfinden) sind dafür drei Streams auf der Konsole vordefiniert: STDIN, STDOUT und STDERR. An dieser Stelle ist für uns jedoch nur STDIN relevant, da es sich dabei um den Input-Stream handelt. Die Implementierung der Benutzereingaben erfolgt dann beispielsweise so:

echo "Eingabe 1: ";
$input1 = fgets(STDIN, 255);
echo "Eingabe 2: ";
$input2 = fgets(STDIN, 255);
echo "Deine Eingaben waren: ".$input1.", ".$input2;

Das Resultat sähe auf der Kommandozeile dann wie folgt aus:

php meinSkript.php
Eingabe 1: test1
Eingabe 2: test2
Deine Eingaben waren: test1, test2

Sollte die PHP-Version älter, und STDIN nicht vordefiniert sein, dann kann der Stream alternativ auch so erzeugt werden:

$stdin = fopen('php://stdin', 'r');

Nun zum letzten Thema – wie schreibt man Skripte, die sowohl im Browser als auch auf der Konsole laufen? Eigentlich ist es ganz einfach. Alles was wir benötigen ist die Information darüber, wo wir uns gerade befinden. Also ob das Skript über die Konsole oder über den Browser aufgerufen wurden. Eine Möglichkeit, dies zu realisieren, ist die Verwendung des eben vorgestellten Streams STDIN. STDIN ist ausschließlich auf der Konsole vordefiniert, sodass wir daran festmachen können (sofern die PHP-Version stimmt), ob wir uns auf der Konsole befinden. Konkret würde das wie folgt aussehen:

if (defined('STDIN') ) {
  echo "Skript laeuft auf der Konsole (CLI).";
} else {
  echo "Skript laeuft im Browser.";
}

Durch dieses Vorgehen ist es dann sehr einfach möglich, eine unterschiedliche Behandlung im Browser und auf der Konsole zu realisieren, wodurch das Skript in beiden Umgebungen lauffähig ist.

Insgesamt lässt sich festhalten, dass PHP nicht nur im Umfeld von Webanwendung hervorragende Arbeit leistet, sondern auch auf der Konsole sehr gut eingesetzt werden kann. Beispielsweise können durch die Funktion exec auch externe Programme und Skripte angesteuert werden, sodass PHP auf Kommandozeilenebene anderen Sprachen in nichts nachsteht.

Getagged mit: , , , , , , , , , , , , , , ,
Veröffentlicht unter Entwicklung
7 Kommentar auf “Kommandozeilenskripte mit PHP
  1. $_SERVER ist eine weitere Unterscheidungsmöglichkeit von CLI und Webscript.

  2. Oliver sagt:

    Ich nutze immer dann die Kommandozeile, wenn ich grade keine Webanwendung will z. B. für Cronjobs, Sachen, die sehr lange dauern und/oder sicherheitskritische Scripte, die nicht in falsche Hände fallen dürfen.

  3. Tom Thaler sagt:

    Gerade bei Skripten mit hoher Laufzeit oder großem Speicherbedarf sollte man allerdings auf eine passende Konfiguration der Parameter in der php.ini achten. Besonders relevant sind dabei max_execution_time, max_input_time und memory_limit.

  4. Maurice sagt:

    Nette Ausfuehrungen! Ich werde mich damit in Zukunft mehr auseinandersetzen! Freue mich auf weitere Beitraege!

  5. Jan sagt:

    Super, dass hier immer soviel Zeit vor dem Computer verbracht wird.

  6. miasin sagt:

    zumindest max_execution_time ist bei der ausfuehrung ueber cli auf 0 gesetzt. es gibt default auf der cli damit keine zeitbeschraenkung. stefan hatte in seinem blog vor einiger zeit auch einen beitrag darueber.

  7. AmyLog12r sagt:

    http://www.tgnv.pl/jak-bezpiecznie-podrozowac
    Buying a new or used automobile could be a difficult approach if you do not know what you are doing. By educating yourself about vehicle store shopping before you visit the car dealership, you can make points much easier for yourself. The following advice can help your next shopping getaway become more pleasant.

    Usually take a auto technician together when searching for a whole new motor vehicle. Auto merchants are well known for promoting lemons and you do not wish to be their following victim. When you can not get a technician to look at vehicles with you, no less than be sure that you have him look at your closing decision prior to buying it.

    Know your limitations. Before you begin store shopping for your forthcoming auto or vehicle, choose how much you can manage to pay, and follow it. Don’t neglect to add desire for your estimations. You will definitely spend about twenty percent as a down payment as well, so be well prepared.

    Before seeing a car dealership, know what kind of automobile you desire. Research all you possibilities before shopping in order to evaluate which works for your finances and family demands. Seek information to discover just how much you need to be paying for a prospective auto.

    Before you sign any contract spend some time to read each line, for example the small print. If you have something outlined that you just do not fully grasp, will not sign before you purchase an solution that you just recognize. Unsavory salesmen can make use of an agreement to put in a lot of costs which were not talked about.

    Should you keep your preceding suggestions at heart next time that you just go looking for a car, you may be more prone to obtain a good bargain. Purchasing a car lacks to become a headache. Just use the guidelines using this post and you will have the vehicle you would like with a great cost.