Ausführen von PHP-Dateien

Es gibt drei verschiedene Wege, PHP-Code in der CLI SAPI auszuführen:

  1. PHP mitteilen, eine bestimmte Datei auszuführen.

    php my_script.php
    
    php -f my_script.php
    

    Beide Wege (ob sie die Option -f verwenden oder nicht) führen die Datei my_script.php aus. Es gibt keine Einschränkungen darauf, welche Dateien ausgeführt werden können; beispielsweise muss ihr PHP-Skript nicht auf .php enden.

    Hinweis:

    Wenn Sie Argumente an das Skript übergeben wollen, müssen Sie als erstes Argument -- übergeben, wenn Sie die -f Option verwenden.

  2. Den auszuführenden PHP-Code direkt auf der Kommandozeile angeben.

    $ php -r 'print_r(get_defined_constants());'
    

    Es muss besonders Acht auf die Ersetzung von Kommandozeilenvariablen und Benutzung von Anführungszeichen gegeben werden.

    Hinweis:

    Achten Sie darauf, dass sie keine PHP-Tags übergeben. Die Option -r benötigt diese nicht und löst einen Parser-Fehler aus, falls sie dennoch verwendet werden.

  3. Eingabe des PHP-Codes über die Standardeingabe (stdin).

    Dies eröffnet die Möglichkeit, PHP dynamisch zu generieren und anschließend an die Binary zu übergeben, wie in diesem (ausgedachten) Beispiel dargestellt:

    $ some_application | some_filter | php | sort -u > final_output.txt
    
Die drei Möglichkeiten zur Codeausführung können nicht kombiniert werden.

Wie jede Kommandozeilenanwendung nimmt das PHP-Binary etliche Argumente entgegen, aber auch das PHP-Skript kann Argumente entgegennehmen. Die Anzahl der Argumente, die an ein Skript übergeben werden können, ist nicht von PHP beschränkt (aber die Kommandozeilenumgebung hat ein bestimmtes Größenlimit für die Anzahl der Argumente, die übergeben werden können; normalerweise werden Sie dieses Limit nicht erreichen). Die Argumente, die dem Skript übergeben werden, sind in dem globalen Array $argv gespeichert. Der erste Index (Null) enthält immer den Skriptnamen. Wenn der Code mittels der Option -r ausgeführt wurde, ist der Wert von $argv[0] ein Bindestrich (-). Selbiges gilt für Code, welcher über STDIN ausgeführt wird.

Die zweite registrierte globale Variable ist $argc, welche die Anzahl der Elemente im Array $argv enthält, (nicht die Anzahl Argumente, die dem Skript übergeben wurden).

Solange die Argumente, welche dem Skript übergeben werden, nicht mit dem Zeichen - beginnen, gibt es nichts besonderes zu beachten. Ein Argument, welches mit - beginnt zu übergeben, wird jedoch Probleme bereiten, da PHP denkt, dass es das Argument selbst verarbeiten muss. Nutzen Sie das Argument-Trennzeichen --, um dies zu vermeiden. Nachdem dieses Trennzeichen von PHP geparst wurde, wird jedes folgende Argument unangetastet an das Skript weitergereicht.

# Dies führt nicht den angegebenen Code aus, sondern zeigt die Optionen von PHP an
$ php -r 'var_dump($argv);' -h
Usage: php [options] [-f] <file> [args...]
[...]

# Dies übergibt das Argument '-h' an Ihr Skript und zeigt die Optionen von PHP nicht an
$ php -r 'var_dump($argv);' -- -h
array(2) {
  [0]=>
  string(1) "-"
  [1]=>
  string(2) "-h"
}

Es gibt auf Unix-Systemen jedoch einen weiteren Weg, um PHP für Kommandozeilenskripte zu verwenden. Sie können ein Skript erstellen, in dem die erste Zeile mit #!/usr/bin/php beginnt. Nachfolgend können Sie normalen PHP-Code innerhalb der PHP-Start- und -End-Tags verwenden. Sobald Sie die Datei ausführbar gemacht haben (beispielsweise mittels chmod +x test), kann Ihr Skript wie ein normales Kommandozeilen- oder Perl-Skript gestartet werden.

Beispiel #1 PHP als Shellskript ausführen

#!/usr/bin/php
<?php
var_dump
($argv);
?>

Angenommen, die Datei heißt test und befindet sich im aktuellen Verzeichnis, dann können wir nun folgendes tun:

$ chmod +x test
$ ./test -h -- foo
array(4) {
  [0]=>
  string(6) "./test"
  [1]=>
  string(2) "-h"
  [2]=>
  string(2) "--"
  [3]=>
  string(3) "foo"
}

Wie Sie sehen können, müssen Sie sich in diesem Fall um nichts weiter kümmern, wenn Sie Ihrem Skript Paramater übergeben, die mit - beginnen.

Die ausführbare PHP-Datei kann verwendet werden, um PHP-Skripte vollkommen unabhängig von einem Webserver auszuführen. Auf Unix-Systemen, sollte die spezielle #! ("shebang") erste Zeile zu PHP-Skripten hinzugefügt werden, damit das System automatisch herausfinden kann, welches Programm zur Ausführung der Datei genutzt werden soll. Auf einem Windows-System können Sie php.exe mit der Doppelklick-Option von .php-Dateien verknüpfen. Sie können auch eine Batchdatei erstellen, um das Skript von PHP ausführen zu lassen. Die erste Zeile, die dem Skript hinzugefügt wird, damit es unter UNIX läuft, stört unter Windows nicht, so dass Sie auf diese Weise problemlos plattformübergreifende Programme schreiben können. Sie finden anschließend ein einfaches Beispiel, wie man ein Kommandozeilenprogramm in PHP schreibt.

Beispiel #2 Ein Skript, das von der Kommandozeile aus ausgeführt werden soll (script.php)

#!/usr/bin/php
<?php

if ($argc != || in_array($argv[1], array('--help''-help''-h''-?'))) {
?>

Das ist ein Kommandozeilenprogramm in PHP mit einer Option.

  Verwendung:
  <?php echo $argv[0]; ?> <option>

  <option> kann ein Wort sein, das Sie gerne
  ausgeben möchten. Mit den Optionen --help,
  -help, -h oder -? bekommen Sie diese Hilfe.

<?php
} else {
    echo 
$argv[1];
}
?>

In dem oben beschriebenen Skript haben wir die erste Zeile dazu verwendet, anzugeben, dass die Datei von PHP ausgeführt werden soll. Wir arbeiten hier mit einer CLI-Version, deswegen werden keine HTTP-Header ausgegeben.

In dem obigen Programm wird zuerst überprüft, ob das notwendige Argument angeben ist (zusätzlich zum Skriptnamen, welcher auch gezählt wird). Wenn nicht, oder wenn das Argument --help, -help, -h oder -? war, wird eine Hilfe-Nachricht ausgegeben, welche $argv[0] nutzt, um den genutzten Skript-Namen auszugeben. Andernfalls wird das Argument ausgegeben, genauso wie es übergeben wurde.

Wenn Sie das obige Skript unter UNIX laufen lassen wollen, müssen Sie es zuerst ausführbar machen, und es danach einfach als script.php GebeDasHierAus oder script.php -h aufrufen. Unter Windows können Sie zu diesem Zweck eine Batchdatei erstellen:

Beispiel #3 Batchdatei zur Ausführung eines Kommandozeilen-Skripts in PHP (script.bat)

@echo OFF
"C:\php\php.exe" script.php %*

Angenommen, Sie haben das Programm script.php genannt und die CLI php.exe hat den Pfad C:\php\php.exe, so wird diese Batchdatei es mit allen übergebenen Argumenten aufrufen: script.bat GebeDasHierAus oder script.bat -h.

Siehe auch die Readline-Erweiterung für weitere Funktionen, um Kommandozeilenanwendungen zu verbessern.

Auf Windows kann PHP so konfiguiert werden, dass auch ausgeführt wird, wenn weder C:\php\php.exe angegeben wird, noch die .php Dateierweiterung genutzt wird. Siehe dazu die Dokumentation zur PHP-Kommandozeile auf Microsoft Windows.

Hinweis:

Unter Windows wird empfohlen, PHP unter einem echten User-Account auszuführen. Wird es unter einem Netzwerk-Account ausgeführt, werden bestimmte Operationen fehlschlagen, weil "keine Zuordnung zwischen Kontennamen und Sicherheits-IDs erfolgte".

add a note add a note

User Contributed Notes 7 notes

up
48
php at richardneill dot org
11 years ago
On Linux, the shebang (#!) line is parsed by the kernel into at most two parts.
For example:

1:  #!/usr/bin/php
2:  #!/usr/bin/env  php
3:  #!/usr/bin/php -n
4:  #!/usr/bin/php -ddisplay_errors=E_ALL
5:  #!/usr/bin/php -n -ddisplay_errors=E_ALL

1. is the standard way to start a script. (compare "#!/bin/bash".)

2. uses "env" to find where PHP is installed: it might be elsewhere in the $PATH, such as /usr/local/bin.

3. if you don't need to use env, you can pass ONE parameter here. For example, to ignore the system's PHP.ini, and go with the defaults, use "-n". (See "man php".)

4.  or, you can set exactly one configuration variable. I recommend this one, because display_errors actually takes effect if it is set here. Otherwise, the only place you can enable it is system-wide in php.ini. If you try to use ini_set() in your script itself, it's too late: if your script has a parse error, it will silently die.

5. This will not (as of 2013) work on Linux. It acts as if the whole string, "-n -ddisplay_errors=E_ALL" were a single argument. But in BSD, the shebang line can take more than 2 arguments, and so it may work as intended.

Summary: use (2) for maximum portability, and (4) for maximum debugging.
up
2
gabriel at figdice dot org
7 years ago
Regarding shebang:

In both Linux and Windows, when you execute a script in CLI with:

    php script.php

then PHP will ignore the very first line of your script if it starts with:

    #!

So, this line is not only absorbed by the kernel when the script file is executable, but it is also ignored by the PHP engine itself.

However, the engine will NOT ignore the first #! line of any included files withing your "outer" script.php.
Any "shebang" line in an included script, will result in simply outputting the line to STDOUT, just as any other text residing outside a <?php ...  ?> block.
up
2
david at frankieandshadow dot com
7 years ago
A gotcha when using #!/usr/bin/php at the start of the file as noted above:

if you originally edited the file on Windows and then attempt to use it on Unix, it won't work because the #! line requires a Unix line ending. Bash gives you the following error message if it has DOS line endings:
"bash: /usr/local/bin/wpreplace.php: /usr/bin/php^M: bad interpreter: No such file or directory"

(In Emacs I used "CTRL-X ENTER f" then type "unix" and ENTER to convert)
up
1
email at alexander-bombis dot de
3 years ago
For Windows:

After the years I also have the fact that I have to use double quotation marks after php -r on Windows shell.

But in the Powershell you can use single or double quotation!
up
-2
petruzanautico at yah00 dot com dot ar
12 years ago
As you can't use -r and -f together, you can circumvent this by doing the following:
php -r '$foo = 678; include("your_script.php");'
up
-3
spencer at aninternetpresence dot net
12 years ago
If you are running the CLI on Windows and use the "-r" option, be sure to enclose your PHP code in double (not single) quotes. Otherwise, your code will not run.
up
-3
synnus at gmail dot com
5 years ago
in php.ini use auto_prepend_file="init.php"
first start script
To Top