PHP - как наилучшим образом определить, является ли текущий вызов из CLI или веб-сервера? - PullRequest
180 голосов
/ 01 июня 2009

Мне нужно определить, является ли текущий вызов PHP из командной строки (CLI) или с веб-сервера (в моем случае, Apache с mod_php).

Любые рекомендуемые методы?

Ответы [ 18 ]

0 голосов
/ 01 апреля 2018

Исходя из Ответ Серебряной Луны выше , я использую эту функцию для возврата правильных разрывов строк:

/**
* Linebreak function
* @return "/n" if cli, else return <br>
*/
protected static function lb(){

    return (defined('STDIN') || php_sapi_name() === 'cli' || isset($_ENV['SHELL']) ||
    (empty($_SERVER['REMOTE_ADDR']) && !isset($_SERVER['HTTP_USER_AGENT']) && count($_SERVER['argv']) > 0) ||
    !isset($_SERVER['REQUEST_METHOD'])) ? "\n" : "<br>";

}
0 голосов
/ 21 июля 2016

Самый простой способ - опросить переменную $argv (что в любом случае вы, вероятно, будете делать для параметров командной строки). Даже если нет параметров $argv возвращает пустой массив.

Если он установлен, то использовался cli. Затем вы можете предположить, что все другие вызовы выполняются через какой-либо веб-сервер или другой.

например:

if (isset($argv)) {
  // Do the cli thing.
}
0 голосов
/ 22 октября 2013
// Detect CLI calls
define("IS_CLI_CALL",( strcmp(php_sapi_name(),'cli') == 0 ));

if(IS_CLI_CALL){
   //do you stuff here

}
0 голосов
/ 01 июня 2009

Мой предпочтительный метод:

if (array_key_exists('SHELL', $_ENV)) {
  echo "Console invocation";
}
else {
  echo "HTTP invocation";
}
0 голосов
/ 01 июня 2009

Я бы посоветовал проверить, установлены ли некоторые записи в массиве $ _ SERVER .

например:.

if (isset($_SERVER['REQUEST_METHOD'])) {
        print "HTTP request\n";
} else {
        print "CLI invocation\n";
}
0 голосов
/ 06 июня 2018

Правильный ответ на этот вопрос зависит от реальных намерений, стоящих за ним:

  • Является ли SAPI решающим фактором (веб-контекст или нет)?
  • Или информация интерпретируется как 'бегущая в tty'?

Если первых, то ответов и написанных комментариев достаточно, чтобы найти решение, которое работает.

Если последнее, приведенные здесь рецепты потерпят неудачу, если инструмент запускается как cronjob или background-job от другого демона - в этом случае я предлагаю дополнительно проверить, является ли STDIN TTY:

function at_tty() {
    return defined("\STDIN") && posix_isatty(\STDIN);
}
0 голосов
/ 14 августа 2018

Как много сложных решений. Как насчет ...

if($_SERVER['REQUEST_SCHEME']=="http" or $_SERVER['REQUEST_SCHEME']=="https"){
    // must be browser :)
}
0 голосов
/ 01 июня 2009

Я бы попробовал:

echo exec('whoami');

Обычно веб-серверы запускаются под другим именем пользователя, поэтому об этом следует говорить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...