2008-12-05 9 views
60

Gibt es eine Möglichkeit zu unterscheiden, ob ein Skript von der Befehlszeile oder vom Webserver aufgerufen wurde?Wie unterscheidet man den Kommandozeilen- und Webserver-Aufruf?

(Siehe What is the canonical way to determine commandline vs. http execution of a PHP script? für beste Antwort und detailliertere Diskussion - nicht das finden, dass man vor der Veröffentlichung)


Ich habe eine (nicht-Produktion) Server mit Apache 2.2.10 und PHP 5.2 .6. In einem webfähigen Verzeichnis befindet sich mein PHP-Skript maintenance_tasks.php. Ich möchte dieses Skript von der Kommandozeile oder durch eine HTTP-Anfrage (durch Öffnen in einem Browser) aufrufen. Gibt es eine Variable, mit der ich zuverlässig bestimmen kann, wie das Skript aufgerufen wird?

(I in Angriff genommen bereits die Ausgaben verschiedener Ansichten für jede Art von Aufruf und HTTP-Antwort-Timeout, nur nach einer Möglichkeit, die beiden Aufruftypen auseinander zu sagen)

ich verschiedene Dinge versuchen werde und meine hinzufügen Ergebnisse unten.

Duplizieren:What is the canonical way to determine commandline vs. http execution of a PHP script?

+0

Welche Frage ist das ein Duplikat von? Es wäre hilfreich, wenn die doppelte Frage damit verknüpft wäre. – starbeamrainbowlabs

+0

@starbeamrainbowlabs: "Duplizieren: http://stackoverflow.com/questions/173851/what-is-the-canonical-way-to-determine-commandline-vt-http-execution-of-a-php-s" at das Ende der Frage ist nicht klar genug? – Piskvor

+0

Das erschien nicht aus irgendeinem Grund für mich, danke für die Antwort :) – starbeamrainbowlabs

Antwort

96

Wenn von der Kommandozeile aufgerufen, wird das Server-Variable HTTP_USER_AGENT nicht gesetzt. Ich benutze diese Konstante zu definieren, ob das Skript von der Kommandozeile aufgerufen wird oder nicht:

define("CLI", !isset($_SERVER['HTTP_USER_AGENT'])); 

UPDATE: Da diese Antwort immer noch als die ‚richtigen‘ eines markiert ist, würde ich Ich mag es, meine Aussage zu überarbeiten - es kann problematisch sein, sich auf den Header "User-Agent" zu verlassen, da es sich um einen benutzerdefinierten Wert handelt.

Bitte verwenden Sie php_sapi_name() == 'cli' oder PHP_SAPI == 'cli', wie von Eugene/cam8001 in den Kommentaren vorgeschlagen.

Vielen Dank für das Aufzeigen!

+72

Verwenden Sie 'php_sapi_name() == 'cli'' stattdessen –

+19

Oder Sie können die Konstante PHP_SAPI http://uk3.php.net verwenden /manual/en/function.php-sapi-name.php#refsect1-function.php-sapi-name-notes – cam8001

+3

Verwenden Sie die Konstante ... wenn Sie einem CLI-Benutzer erlauben, normalerweise eingeschränkte Dinge zu tun, dann alle I Ich muss Ihnen ein benutzerdefiniertes HTTP_USER_AGENT mit der Zeichenfolge "CLI" irgendwo senden. –

3

Ich habe die $_SERVER Superglobal in beiden Aufrufen verglichen. Es scheint, dass $_SERVER['argc'] (das heißt Anzahl der Argumente an das Skript übergeben wird) festgelegt ist nur, wenn sie von Shell/Kommandozeile ausgeführt wird:

<?php 
if (isset($_SERVER['argc'])) { 
    define('CLI', true); 
} else { 
    define('CLI', false); 
} 

, die sowohl auf Linux und Windows-Hosts zu funktionieren scheint. (Zuerst dachte ich darüber nach, einige der Umgebungsvariablen zu überprüfen, aber diese sind für jedes Betriebssystem unterschiedlich. Außerdem fehlen in der CLI-Version alle Header $_SERVER['HTTP_*'], aber ich bin mir nicht sicher, ob das zuverlässig genug ist.)

+10

Dies funktioniert nicht auf manchen Maschinen, da argc/argv mit get params gefüllt ist! –

Verwandte Themen