Zum Hauptmenü

Standardfehlerausgabe und Exit Status in PHP-CLI

Jörg Kruse

Normalerweise kommt PHP ja als Scriptsprache zur Erstellung von Webseiten zum Einsatz. Wenn PHP-CLI installiert ist, kann PHP aber auch von der Kommandozeile aufgerufen werden. Wie werden nun Fehlermeldungen auf die Standardfehlerausgabe (stderr) geschrieben und Exit Codes zurückgegeben, wie es bei Linux-Shell-Scripten üblich ist? wie wird beispielsweise folgendes Bash-Script test.sh in PHP übersetzt:


#!/bin/bash

if [ $# -ne 1 ]; then
    echo "Usage: $(basename $0) <word>" >&2
    exit 1
fi

echo $1

$# enthält die Anzahl der Parameter, $0 den Kommandonamen und $1 den ersten Parameter. Wenn kein Parameter an das Kommando angehangen wird, wird eine Fehlermeldung auf die Standardfehlerausgabe geschrieben (‚>&2‘) und der Exit Code 1 zurückgegeben. Andernfalls wird der Parameter auf die Standardausgabe (stdout) ausgegeben. Folgende Ein- und Ausgaben auf der Kommandozeile verdeutlichen dies:


$ chmod +x test.sh
$ ./test.sh
Usage: test.sh <word>
$ echo $?
1
$ ./test.sh 2> /dev/null
$ ./test.sh foo
foo

Mit ‚chmod +x‘ wird das Script ausführbar gemacht. $? gibt den letzten Exit Code aus. Mit ‚2> /dev/null‘ kann eine Fehlermeldung von stderr nach /dev/null entsorgt werden.

In PHP würde das Script test.php so ausschauen:


#!/usr/bin/php
<?php

if ($argc != 2) {
    fwrite(STDERR, 'Usage: ' . basename($argv[0]) . ' <word>' . "\n");
    exit(1);
}

echo $argv[1] . "\n";

$argv[0] enthält den Kommandonamen und $argv[1] den ersten Parameter. $argc zählt nicht nur die vorhandenen Parameter, sondern auch den Kommandonamen mit, deswegen wird hier in der Bedingung auf die Zahl 2 geprüft. Mit fwrite() kann auf stderr geschrieben werden, und der Parameter von exit() enthält den Exit Status. Wichtig ist es, bei den Ausgaben jeweils noch einen Zeilenumbruch dranzuhängen, damit der Prompt wieder in der nächsten Zeile anfängt

Das PHP-Script verhält sich dann analog zum Bash-Script:


$ chmod +x test.php
$ ./test.php
Usage: test.php <word>
$ echo $?
1
$ ./test.php 2> /dev/null
$ ./test.php foo
foo
Tags: Bash, PHP

Die Kommentarfunktion wurde nach 180 Tagen automatisch geschlossen.
Fragen zu diesem Thema können auch in meinen Webmaster-Forum gestellt werden: