Was ist der Unterschied zwischen der Ausführung von PHP von der Kommandozeile und von HTTP? Verwenden sie die gleiche ausführbare Datei wie (php.exe oder php-cgi.exe (Apache oder IIS))? Unterscheiden sich die Ergebnisse, wenn sie von der Befehlszeile oder HTTP ausgeführt werden?Unterschied zwischen der Ausführung von PHP von der Kommandozeile und von der Http Seite
Antwort
Ob PHP über ein Webservermodul oder eine CLI aufgerufen wird, es wird die gleiche Binärbasis verwendet (kann aber manchmal so konfiguriert werden, dass verschiedene Ini verwendet werden, die das Skript beeinflussen können). Es ist auch eine andere Umgebung, so dass Umgebungsvariablen nicht genau sein werden.
PHP ist sich auch bewusst, dass es anders aufgerufen wurde und passt seine Ausgabe entsprechend an (d. H., phpinfo();
Ausgabe wird anders formatiert, wenn sie über CLI aufgerufen wird).
Oder sie verwenden eine andere Binärdatei. Die meisten Implementierungen, auf die ich stieß, hatten eine völlig andere Version für das cli & apache Modul, manchmal nicht einmal die gleiche Version .... – Wrikken
@Wrikken. Das muss aus irgendeinem Grund vom Administrator absichtlich gemacht worden sein. Wie auch immer, ich habe es jetzt als 'binary base' bezeichnet. – webbiedave
Wenn Sie PHP über die Befehlszeile ausführen, haben Ihre Server-Apache oder IIS keine Rolle zu spielen. Sie benutzen einfach php4 oder php5 Ordner, um Ihren Code auszuführen. Je nach den verfügbaren Bibliotheken und den php.ini-Einstellungen in den beiden Ordnern kann die Ausführung abweichen. Bei der Ausführung von Apache wird php.ini in Ihrem Apache/Bin verwendet. Wenn von der Kommandozeile php.ini aus Ihrem php5 oder php4 Ordner verwendet wird.
In den meisten Fällen ist alles gleich. Große Unterschiede bestehen darin, dass die Super Globals möglicherweise nicht gefüllt sind. Der beste Ort, um auf diese aussehen würde auf php.net http://php.net/manual/en/features.commandline.php
Hauptunterschied ist Argumentübergabe: Laufen von der CLI, müssen Sie nicht mehr als $ _GET, $ _POST, $ _SESSION, etc; Argumente müssen also als Befehlszeilenparameter übergeben und mit if $ _SERVER ['argc'] und $ _SERVER ['argv'] aufgerufen werden. Achten Sie auf das Verzeichnis, in dem der Code ausgeführt wird und den Include-Pfad. und stelle sicher, dass du weißt, welche php.ini du geladen hast. Bei der Ausgabe wird HTML-Markup nicht als Markup dargestellt, sondern als < h1> etc .... Achten Sie besonders auf
(PHP_EOL ist äußerst nützlich) und mehrere Leerzeichen oder Tabs tatsächlich erscheinen als mehrere Leerzeichen oder Tabs rathe rthan a einzelnes Leerzeichen. Forget Header() und andere HTTP-spezifische Funktionen
Anders als gesagt, wird es wahrscheinlich Unterschiede in den Berechtigungen geben, auf welche Teile des Dateisystems zugegriffen werden kann: PHP über Webserver läuft als Webserver-Benutzer, PHP von Die Befehlszeile wird wie Sie ausgeführt.
Kein HTML-Markup in Fehler
Dies ist eine php.ini-Einstellung (html_errors), aber diese standardmäßig ausgeschaltet in der cli Version.
Protokollierung stderr
Normalerweise Fehler der webservers error.log angemeldet sind, aber in der cli sind Version Fehler auf stderr geschrieben.
Dies ist auch als php.ini Einstellung (error_log)
php.ini
Die php.ini-Datei zur Verfügung, die eine andere Datei kann für die cli-Version verwendet wird, sein. Das kann zu einigen ekligen Bugs führen (Curl plötzlich nicht verfügbar, etc.).
Verschiedene Executables
Es ist möglich, mehr PHP-Version (php5 neben php4)
Verwenden which php
um zu bestimmen, zu installieren, welche Version Sie verwenden.
Alles wird als Text
var_dump() dargestellt ist lesbar, ohne eine <pre>
keinen Unterschied zwischen header('Hello');
und echo('Hello');
Obwohl diese Frage sehr alt ist, würde ich @ Bob Fangers erweitern möchten ein bisschen.
PHP-Dateien aus der Befehlszeile ist ziemlich trivial, man muss nur daran denken, dass es auf einem Web-Server oder auf einem Server Kommandozeilen-Schnittstelle einige Unterschiede aus Ausführen der Datei sind:
keine Plätzchen verfügbar
Kein
$_GET
,$_POST
,$_SESSION
verfügbar Aber Sie können verwenden Parameter als Argument an den Befehl übergeben zu bekommen. Der erste Wert ist immer der Dateiname.Zum Beispiel diese Datei genommen:
<?php var_dump($argv); ?>
wie folgt aufgerufen:
[email protected]:$ /usr/bin/php /home/user/file.php foo bar
würden Sie diese Ausgabe:
array(4) { [0]=> string(8) "file.php" [1]=> string(3) "foo" [2]=> string(3) "bar" }
Volldateipfade von Ihren Servern root erforderlich Sie müssen die vollständigen Pfade zu Ihren Dateien angeben (z. B. fo r
include()
,require()
,file_get_contents()
, ...), obwohl sie sich möglicherweise im selben Ordner befinden.verschiedene Benutzer-/Berechtigungseinstellungen Die Dateien werden nicht vom Benutzer
www-data
ausgeführt, sondern vom Benutzer, der bei Ihrem Computer angemeldet ist. Dies betrifft alle Funktionsaufrufe Ihrer Datei, die sich auf das Dateisystem der Maschine auswirken (z. B.mkdir()
,include()
, ...). Daher müssen Sie sicherstellen, dass Sie diesem Benutzer die entsprechende Berechtigung erteilen.
Zusätzlich zu diesem nützlichen Kompendium von Antworten sind' $ _SERVER' Variablen auch für das Skript in CLI nicht verfügbar, wie zum Beispiel '$ _SERVER ['DOCUMENT_ROOT']' 'für Der Zugriff umfasst ein Skript. – Martin
- 1. von der Kommandozeile
- 2. PHP Interactive - Datei von der Kommandozeile laden
- 3. PHP warten auf Eingabe von der Kommandozeile
- 4. Schnelle Benchmark von der Kommandozeile
- 5. Wie maven Plugin-Ausführung direkt von der Kommandozeile ausführen?
- 6. Gibt es einen Unterschied zwischen der Ausführung eines Bash-Skripts und der manuellen Ausführung?
- 7. PHP-Workflow - Reihenfolge der Ausführung von Funktionen
- 8. MySQL Backup und Restore von der Kommandozeile
- 9. Sscanf Problem und Lesen von der Kommandozeile
- 10. Probleme Xcode von der Kommandozeile
- 11. laufen Mops von der Kommandozeile
- 12. Erstellen von Xcode-Projekt von der Kommandozeile
- 13. Was ist der Unterschied zwischen der Verwendung von "http: //" und nur "//" in src oder href?
- 14. Maven: Ausführung von der Kommandozeile und mehrere Ausführungen in der Konfig
- 15. Unable CodeIgniter-Controller-Funktion von der Kommandozeile
- 16. Was ist der Unterschied zwischen der Rückgabe von bind und dem Ergebnis der Verwendung von function()
- 17. Was ist der Unterschied zwischen der "Sequenz" von Oracle und der Auto_increment-Funktion von MySql?
- 18. Was ist der Unterschied zwischen http: // *: 80 und http: // +: 80
- 19. Beenden der weiteren Ausführung von jquery
- 20. Stop Ausführung von angular $ timeout nachdem der $ http Interceptor
- 21. Der Unterschied zwischen den Verwendungen von SetWindowsHookEx
- 22. Was ist der Unterschied zwischen HttpMethod und RequestType von HttpRequest?
- 23. Was ist der Unterschied zwischen der Verwendung von "" und "" und() beim Deklarieren von Variablen?
- 24. ausschließen Verzeichnisse von der Kommandozeile Ausgabe
- 25. Unterschied zwischen // und http: //
- 26. Unterschiede in Java-Aufruf zwischen der Ausführung von Anwendung von Eclipse vs. von der Befehlszeile
- 27. Unterschied zwischen http und www
- 28. Was ist der Unterschied zwischen Ausführung und Auswertung?
- 29. Was ist der generelle Unterschied zwischen Superscalar und OoO-Ausführung?
- 30. Bibliothek/Framework zum Analysieren der Ausgabe von der Kommandozeile (C#)?
Das klingt wie eine Hausaufgabe oder eine Testfrage für mich. Nicht dass das schlecht oder so ist. – Nathan
Sie sollten wirklich das Handbuch (http://www.php.net/manual/en/features.commandline.php) lesen. Es zeigt Ihnen Unterschiede und Bonus-Features, wie interaktive Shell, Ausführung von Skriptdateien usw. –