Как отличить запросы http и cli?

Название довольно простое. Я должен знать на стороне сервера, вызывается ли скрипт через HTTP-запрос или из командной строки. Я мог бы проверить $_SERVER['argv'] или $_SERVER['argc'].
Каков практичный способ сделать это?


person erenon    schedule 31.01.2010    source источник


Ответы (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 Это путь. У меня были проблемы с проверкой переменных $_SERVER и тому подобного. Этот всегда работает. - person Pekka; 31.01.2010

Посмотрите на ключи в $_SERVER. Если это запрос cli, вы не должны видеть ничего, начинающегося с «HTTP».


Вот простой тестовый код:

<?php

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

?>

И вот результат:

aj@mmdev0:~/so$ php cli.php |grep HTTP
aj@mmdev0:~/so$
person AJ.    schedule 31.01.2010
comment
Нет необходимости в цикле, когда вы можете просто проверить одно значение. - person Matteo Riva; 31.01.2010
comment
@kemp, вопрос ОП специально задавал альтернативы argc - person AJ.; 31.01.2010

Возможно, проверить, не установлен ли $_SERVER['HTTP_HOST']? Потому что я считаю, что эта переменная заполняется через заголовки запроса, отправляемые в файл при выполнении, а командная строка, вероятно, не отправляет заголовки.

person Tyler Carter    schedule 31.01.2010

Вы можете проверить, установлена ​​ли глобальная переменная $argc.

person Matteo Riva    schedule 31.01.2010

Я предлагаю проверить if(isset($_SERVER['SERVER_NAME']))

person Traveling Tech Guy    schedule 31.01.2010
comment
Я не уверен, что это не установлено. Это может быть, особенно если вы выполняете свой файл PHP удаленно. - person Tyler Carter; 31.01.2010
comment
Я думаю, что массив $_SERVER зарезервирован для транзакций HTTP, но вы можете быть правы. Все же стоит пройтись по различным членам в нем, так как я уверен, что они различаются между локальным и удаленным исполнением. - person Traveling Tech Guy; 31.01.2010

Но вы все равно должны отправлять данные через http (tcp), независимо от того, вызывается ли скрипт из cli или из браузера.

person streetparade    schedule 31.01.2010