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 ?>
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
Weitere Produkte im Medialinx Shop »
Versandartikel
Onlineartikel
Alle Rezensionen aus dem Linux-Magazin
- Buecher/07 Bücher über 3-D-Programmierung sowie die Sprache Dart
- Buecher/06 Bücher über Map-Reduce und über die Sprache Erlang
- Buecher/05 Bücher über Scala und über Suchmaschinen-Optimierung
- Buecher/04 Bücher über Metasploit sowie über Erlang/OTP
- Buecher/03 Bücher über die LPI-Level-2-Zertifizierung
- Buecher/02 Bücher über Node.js und über nebenläufige Programmierung
- Buecher/01 Bücher über Linux-HA sowie über PHP-Webprogrammierung
- Buecher/12 Bücher über HTML-5-Apps sowie Computer Vision mit Python
- Buecher/11 Bücher über Statistik sowie über C++-Metaprogrammierung
- Buecher/10 Bücher zu PHP-Webbots sowie zur Emacs-Programmierung
Insecurity Bulletin
Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...





