Frage

Gibt es eine Möglichkeit, zu unterscheiden, ob ein Skript von der Kommandozeile oder vom Web-Server aufgerufen wurde?

( Es Was ist der kanonische Weg ist, um zu bestimmen Commandline vs. http Ausführung eines PHP-Skript für beste Antwort und ausführlichere Diskussion - nicht das finden, dass man vor der Veröffentlichung)


Ich habe einen (nicht-Produktion) Server mit Apache 2.2.10 und PHP 5.2.6. Auf sie, in einem Web-zugängliches Verzeichnis ist mein PHP-Skript, maintenance_tasks.php. Ich möchte dieses Skript von der Kommandozeile aufgerufen werden oder über eine HTTP-Anforderung (durch Öffnung in einem Browser). Gibt es eine Variable, die mir erlaubt, zuverlässig zu bestimmen, wie Skript aufgerufen wird?

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

werde ich verschiedene Dinge versuchen, und meine Erkenntnisse unten ein.

Duplizieren: Was ist der üblicher Weg, Commandline vs. http Ausführung eines PHP-Skript, um zu bestimmen?

War es hilfreich?

Lösung

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‘ ein markiert ist, würde Ich mag meine Aussage revidieren - auf den „User-Agenten“ Header verlassen kann problematisch sein, da es ein ist benutzerdefinierter Wert.

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

Danke für diesen Hinweis!

Andere Tipps

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

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

Das scheint sowohl auf Linux- und Windows-Rechner zu arbeiten. (Zuerst dachte ich, für einen Teil der Umgebungsvariablen zur Prüfung, aber die sind unterschiedlich für jedes Betriebssystem. Auch all $_SERVER['HTTP_*'] Header in der CLI-Version fehlen, aber ich bin nicht sicher, ob das zuverlässig genug.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top