Wie führe ich PHP-Code über die Kommandozeile aus?

163

Ich möchte eine einzelne PHP-Anweisung wie if(function_exists("my_func")) echo 'function exists';direkt mit der Kommandozeile ausführen , ohne eine separate PHP-Datei verwenden zu müssen.

Wie ist es möglich ?

Steve
quelle
1
Wenn Sie function_exists () ausführen, ohne andere Dateien mit benutzerdefinierten Funktionen zu verwenden, ist dies nicht besonders hilfreich, außer wenn Sie die PHP-Version testen, die Sie auf andere Weise herausfinden können. Auf welche Funktion möchten Sie testen?
Matt Gibson
Ich möchte diese Funktion testen: sg_load ()
Steve
2
Klingt so, als ob Sie wirklich herausfinden möchten, ob die PHP-Erweiterung von sourceguardian aktiviert ist?
Matt Gibson
2
dann sollte phpinfo () es dir sagen.
JPI

Antworten:

256

Wenn Sie PHP in der Befehlszeile ausführen möchten, empfehle ich Ihnen, phpsh zu installieren , eine anständige PHP-Shell . Es macht viel mehr Spaß.

Auf jeden Fall bietet der Befehl php zwei Schalter, um Code über die Befehlszeile auszuführen :

-r <code>        Run PHP <code> without using script tags <?..?>
-R <code>        Run PHP <code> for every input line

Sie können den Schalter -r von php als solchen verwenden:

php -r 'echo function_exists("foo") ? "yes" : "no";'

Der obige PHP-Befehl sollte ausgegeben no und zurückgegeben werden, 0 wie Sie sehen können:

>>> php -r 'echo function_exists("foo") ? "yes" : "no";'
no
>>> echo $? # print the return value of the previous command
0

Ein weiterer lustiger Schalter ist php -a :

-a               Run as interactive shell

Es ist etwas lahm im Vergleich zu PHPSH , aber wenn Sie nicht die fantastische interaktive Shell für PHP installieren möchten, die von Facebook erstellt wurde, um die Tab-Vervollständigung, den Verlauf usw. zu erhalten , verwenden Sie -a als solche :

>>> php -a
Interactive shell

php > echo function_exists("foo") ? "yes" : "no";
no
php > 

Wenn es auf Ihrer Box nicht funktioniert wie auf meiner Box * es * ( getestet unter Ubuntu und Arch), ist Ihr PHP-Setup wahrscheinlich unscharf oder kaputt . Wenn Sie diesen Befehl ausführen:

php -i | grep 'API'

Sie sollten sehen:

Server API => Command Line Interface

Wenn Sie dies nicht tun , bedeutet dies, dass möglicherweise ein anderer Befehl die CLI SAPI bereitstellt . Versuchen Sie es mit php-cli. Vielleicht ist es ein Paket oder ein Befehl, der in Ihrem Betriebssystem verfügbar ist.

Wenn Sie feststellen, dass Ihr PHP-Befehl die CLI (Command Line Interface) SAPI (Server API) verwendet, führen Sie aus php -h | grep code, um herauszufinden, welcher verrückte Switch - da sich dies seit Jahren nicht geändert hat - die Ausführung von Code in Ihrer Version / Ihrem Setup ermöglicht.

Noch ein paar Beispiele, nur um sicherzugehen, dass es auf meinen Boxen funktioniert:

>>> php -r 'echo function_exists("sg_load") ? "yes" : "no";' 
no
>>> php -r 'echo function_exists("print_r") ? "yes" : "no";' 
yes

Beachten Sie außerdem, dass möglicherweise eine Erweiterung in die CLI und nicht in die CGI- oder Apache-SAPI geladen wird. Es ist wahrscheinlich, dass mehrere PHP-SAPIs unterschiedliche php.ini-Dateien verwenden , z. B. /etc/php/cli/php.inivs /etc/php/cgi/php.inivs /etc/php/apache/php.iniauf einer Gentoo-Box. Finden Sie heraus, mit welcher INI-Datei verwendet wird php -i | grep ini.

jpic
quelle
Vielleicht ist dein PHP-Setup kaputt. Ich habe meine Antwort mit Hinweisen aktualisiert, um es herauszufinden.
JPI
Es wurde ein Hinweis zu php -a hinzugefügt, der für Sie nützlich sein könnte.
JPI
6
Beachten Sie, dass phpsh nicht mehr von seinem Autor (Facebook) gepflegt wird und jemand auf der Google Groups-Seite 2012 sagte, dass "phpsh nicht mehr wirklich unterstützt oder nützlich ist" . Sie könnten in der Boris REPL nach einer verbesserten PHP-Konsole suchen .
Ben Creasy
3

In der Befehlszeile:

php -i | grep sourceguardian

Wenn es dort ist, erhalten Sie Text. Wenn nicht, bekommen Sie nichts.

Matt Gibson
quelle
4
Entweder bin ich blind oder diese Antwort hat nichts mit der Frage zu tun. Wie soll diese Antwort die Frage beantworten, wie man PHP-Code direkt über die Befehlszeile ausführt, ohne PHP-Code in einer .phpDatei zu speichern ?
Trejder
15
@trejder Für einen Moment habe ich mich gefragt, ob ich die falsche Frage beantwortet habe, aber dann habe ich mir den Bearbeitungsverlauf und die Kommentare angesehen. Dies beantwortet das, was das OP wirklich zu brauchen schien: herauszufinden, ob eine bestimmte PHP-Erweiterung geladen wurde. Die Frage wurde inzwischen umformuliert, daher passt sie jetzt nicht mehr so ​​gut.
Matt Gibson
3

Sie können verwenden:

 echo '<?php if(function_exists("my_func")) echo "function exists"; ' | php

Das kurze Tag " <? = " Kann ebenfalls hilfreich sein:

 echo '<?= function_exists("foo") ? "yes" : "no";' | php
 echo '<?= 8+7+9 ;' | php

Das schließende Tag "?>" Ist optional, aber vergessen Sie nicht das letzte ";" !

fred727
quelle
2
Dies scheint mehr Ärger zu sein als die 7-jährige akzeptierte Antwort. Mit müssen php -rSie sich keine Gedanken über das Öffnen von PHP-Tags machen.
Miken32
1

Verwenden von PHP über die Befehlszeile

Verwenden Sie " anstelle von " unter Windows, wenn Sie die CLI-Version mit -r verwenden

php -r "echo 1"

-- richtig

php -r 'echo 1'

-- falsch

  PHP Parse error:  syntax error, unexpected ''echo' (T_ENCAPSED_AND_WHITESPACE), expecting end of file in Command line code on line 1
user1942505
quelle