Jak odróżnić żądania http i cli?

Tytuł jest dość prosty. Muszę wiedzieć po stronie serwera, czy skrypt wywołany przez żądanie HTTP, czy z wiersza poleceń. Mógłbym zbadać $_SERVER['argv'] lub $_SERVER['argc'].
Jaki jest pragmatyczny na to sposób?


person erenon    schedule 31.01.2010    source źródło


Odpowiedzi (6)


http://us3.php.net/manual/en/function.php-sapi-name.php

<?php
echo PHP_SAPI;
echo php_sapi_name();
?>
person Matthew    schedule 31.01.2010
comment
+1 To jest droga. Miałem problemy ze sprawdzaniem zmiennych $_SERVER i tym podobnych. Ten zawsze działa. - person Pekka; 31.01.2010

Spójrz na klucze w $_SERVER. Jeśli jest to żądanie CLI, nie powinieneś widzieć żadnego, które zaczyna się od „HTTP”.


Oto prosty kod testowy:

<?php

foreach( $_SERVER as $k=>$v ){
    echo "$k: $v\n";
}

?>

A oto wynik:

aj@mmdev0:~/so$ php cli.php |grep HTTP
aj@mmdev0:~/so$
person AJ.    schedule 31.01.2010
comment
Nie ma potrzeby wykonywania pętli, gdy możesz przetestować tylko jedną wartość. - person Matteo Riva; 31.01.2010
comment
@kemp, pytanie OP dotyczyło w szczególności alternatyw dla argc - person AJ.; 31.01.2010

Ewentualnie sprawdzasz, czy nie ustawiono $_SERVER['HTTP_HOST']? Ponieważ uważam, że zmienna jest wypełniana przez nagłówki żądań wysyłane do pliku po wykonaniu, a wiersz poleceń prawdopodobnie nie wysyła nagłówków.

person Tyler Carter    schedule 31.01.2010

Możesz sprawdzić, czy zmienna globalna $argc jest ustawiona.

person Matteo Riva    schedule 31.01.2010

Proponuję sprawdzić if(isset($_SERVER['SERVER_NAME']))

person Traveling Tech Guy    schedule 31.01.2010
comment
Nie jestem pewien, czy to nie jest ustawione. Może, zwłaszcza jeśli zdalnie wykonujesz plik PHP.. - person Tyler Carter; 31.01.2010
comment
Myślę, że tablica $_SERVER jest zarezerwowana dla transakcji HTTP, ale możesz mieć rację. Nadal warto przejść przez różnych członków, ponieważ jestem pewien, że różnią się między wykonaniem lokalnym i zdalnym. - person Traveling Tech Guy; 31.01.2010

Ale i tak musisz przesłać dane przez http (tcp) bez względu na to, czy skrypt jest wywoływany z cli, czy z przeglądarki

person streetparade    schedule 31.01.2010