Open Source im professionellen Einsatz

Handfeste Argumente

Vorsicht ist geboten, wenn man an den CLI fertige PHP-Skripte verfüttert, die eigentlich für das Web bestimmt sind. Zunächst einmal gibt der CLI einfach alle Texte aus, die um »<?php ... ?>« herumstehen. Im Extremfall sieht der Anwender also ellenlangen HTML-Code auf der Kommandozeile durchlaufen.

Des Weiteren fehlen die Arrays »$_GET« , »$_POST« und »$_COOKIE« , in denen sonst die vom Browser übergebenen Daten landen. Stattdessen stecken alle auf der Kommandozeile übergebenen Argumente im Array »$_SERVER['argv']« . Wie viele Argumente übergeben wurden, verrät die Variable »$_SERVER['argc']« . Ein Beispiel für ihre Verwendung zeigt Listing 3, das einfach alle übergebenen Argumente auflistet. Wie im Ergebnis in Abbildung 1 zu sehen, ist das erste Argument immer der Dateiname des ausgeführten Skripts selbst.

Listing 3

Argumente auswerten

01 <?php
02         echo "Anzahl Argumente: " . $_SERVER['argc'] . "\n";
03
04         $argumente = $_SERVER['argv'];
05         foreach ($argumente as $nr => $argument) {
06                 echo "argumente[$nr] = $argument\n";
07         }
08
09         exit(0);
10  ?>

Abbildung 1: Die dem Programm übergebenen Argumente lassen sich auch in PHP-Skripten auswerten.

Abbildung 2: Die Funktion posix_getpwuid() liefert einige Informationen zu dem Benutzer, unter dem das Skript läuft.

Auf eine kleines Problem trifft der Benutzer, wenn er ein Skript per »php« aufruft und ihm gleichzeitig noch Argumente übergeben möchte, die mit einem »-« beginnen:

php beispiel.php -h

In diesem Fall würde der CLI selbst das »-h« interpretieren und seinen eigenen Hilfetext runterbeten. Abhilfe schafft das Argument-Trennzeichen »--« :

php beispiel.php -- -h

Dieses Problem tritt nicht auf, wenn der Anwender das Skript wie in Listing 1 mit einem Shebang versieht, ausführbar macht und dann direkt aufruft.

Konservenöffner

Dateien öffnet PHP wie viele andere Programmiersprachen mit der Funktion »fopen()« , die ein so genanntes Handle zurückgibt. Diesen Zeiger auf die Datei benötigen dann alle weiteren Ein- und Ausgaberoutinen. Dazu zählt beispielsweise »fgets()« , das eine Textzeile aus der Datei einliest:

$handle = fopen("test.txt", "r");
$zeile = trim(fgets($handle));
fclose($handle);

Die Funktion »trim()« entfernt hier zusätzlich noch alle Whitespaces – also Leerzeichen und Tabulatoren – am Anfang und Ende einer jeden Zeile. Das ordnungsgemäße Schließen der Datei erledigt »fclose()« . Das Programmiererleben erleichtern ein paar vordefinierte Konstanten. Statt erst die Standardeingabe zu öffnen mit

fopen("php://stdin", "r");

und dann eine Zeile zu lesen, kann der PHP-Anwender auch direkt zu »STDIN« greifen:

$zeile = fgets(STDIN);

Analog gibt es noch »STDOUT« und »STDERR« für die Standardausgabe beziehungsweise Standardfehlerausgabe. Auch das zeilenweise Einlesen einer Datei gerät mit PHP zum Kinderspiel, wie Listing 4 beweist. In seiner zweiten Zeile öffnet »file()« eine Datei und liefert alle Zeilen in einem Array zurück. Dieses durchläuft anschließend die »foreach« -Schleife und gibt jede Zeile auf dem Bildschirm aus.

Listing 4

Zeilenweises Einlesen einer Datei

01 <?php
02
03         $dateiname ="test.txt";
04         $zeilen = file($dateiname);
05
06         foreach ( $zeilen as $nr => $zeile ) {
07                 $zeile = trim($zeile);
08                 echo "$nr : $zeile\n";
09         }
10
11         exit(0);
12 ?>

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook