2008-12-05 13 views
60

Czy istnieje sposób na odróżnienie, czy skrypt został wywołany z wiersza poleceń lub z serwera WWW?Jak odróżnić wywołanie z linii komend i serwera WWW?

(Zobacz What is the canonical way to determine commandline vs. http execution of a PHP script? za najlepszą odpowiedź i bardziej szczegółowej dyskusji - nie okaże się, że jeden przed wysłaniem)


mam (nieprodukcyjnych) Serwer Apache 2.2.10 oraz z PHP 5.2 .6. Na nim w katalogu dostępnym do sieci znajduje się mój skrypt PHP, maintenance_tasks.php. Chciałbym wywołać ten skrypt z wiersza poleceń lub poprzez żądanie HTTP (otwierając w przeglądarce). Czy jest jakaś zmienna, która pozwala mi w niezawodny sposób określić sposób wywoływania skryptu?

(I już rozwiązane kwestie różnych widoków dla każdego typu wywołania i limit czasu odpowiedzi HTTP, po prostu szukasz sposobu mówienia dwa rodzaje procedury wywołania siebie)

będę próbować różnych rzeczy i dodać moje ustalenia poniżej.

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

+0

Które pytanie jest duplikatem? Byłoby pomocne, gdyby powielone pytanie było powiązane. – starbeamrainbowlabs

+0

@ starbeamrainbowlabs: "Duplicate: http://stackoverflow.com/questions/173851/what-is-the-canonical-way-to-determine-commandline-vs-http-execution-of-a-php-s" at sam koniec pytania nie jest wystarczająco jasny? – Piskvor

+0

To nie pokazało się dla mnie z jakiegoś powodu, dziękuję za odpowiedź :) – starbeamrainbowlabs

Odpowiedz

96

Jeśli wywoływane z linii komend, serwer zmienna HTTP_USER_AGENT nie jest ustawiony. Używam tej stałej do zdefiniowania, czy skrypt jest wywoływany z linii poleceń lub nie:

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

UPDATE: Ponieważ ta odpowiedź jest wciąż oznaczony jako „poprawny” jeden, ja Chciałbym poprawić moje oświadczenie - poleganie na nagłówku "User-Agent" może być problematyczne, ponieważ jest to wartość zdefiniowana przez użytkownika.

Proszę używać php_sapi_name() == 'cli' lub PHP_SAPI == 'cli', zgodnie z sugestią Eugene/Cam8001 w komentarzach.

Dzięki za wskazanie tego!

+72

Użyj 'php_sapi_name() == 'cli'' zamiast –

+19

Lub możesz użyć stałej PHP_SAPI http://uk3.php.net /manual/en/function.php-sapi-name.php#refsect1-function.php-sapi-name-notes – cam8001

+3

Użyj stałej ... jeśli pozwalasz użytkownikowi CLI na robienie normalnie ograniczonych rzeczy, to wszystko ja Musimy wysłać Ci niestandardowy HTTP_USER_AGENT z łańcuchem "CLI" gdzieś w nim. –

3

Porównywałem superglobal $_SERVER w obu wywołaniach. Wydaje się, że $_SERVER['argc'] (czyli liczba argumentów przekazanych do skryptu) ustawiony jest tylko wtedy, gdy uruchomiony z linii skorupa/polecenia:

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

To wydaje się działać zarówno na Linux i Windows gospodarzy. (Najpierw pomyślałem o sprawdzeniu niektórych zmiennych środowiskowych, ale są one różne dla każdego systemu operacyjnego.) W nagłówku CLI brakuje wszystkich nagłówków $_SERVER['HTTP_*'], ale nie jestem pewien, czy to wystarczająco wiarygodne.)

+10

To nie działa na niektórych maszynach, ponieważ argc/argv jest wypełnione parami get! –

Powiązane problemy