2010-06-10 4 views
11

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

+0

Das klingt wie eine Hausaufgabe oder eine Testfrage für mich. Nicht dass das schlecht oder so ist. – Nathan

+0

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. –

Antwort

2

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).

+0

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

+0

@Wrikken. Das muss aus irgendeinem Grund vom Administrator absichtlich gemacht worden sein. Wie auch immer, ich habe es jetzt als 'binary base' bezeichnet. – webbiedave

1

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.

2

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

1

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.

6

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');

0

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.

+1

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

Verwandte Themen