Мне нужно определить, является ли текущий вызов PHP из командной строки (CLI) или с веб-сервера (в моем случае Apache с mod_php).
Любые рекомендуемые методы?
Мне нужно определить, является ли текущий вызов PHP из командной строки (CLI) или с веб-сервера (в моем случае Apache с mod_php).
Любые рекомендуемые методы?
 php_sapi_name - это функция, которую вы хотите использовать, поскольку она возвращает строчную строку типа интерфейса. Кроме того, существует постоянная PHP PHP_SAPI.
Документацию можно найти здесь: http://php.net/php_sapi_name
Например, чтобы определить, запущен ли PHP из CLI, вы можете использовать эту функцию:
function isCommandLineInterface()
{
    return (php_sapi_name() === 'cli');
}
Я думаю, он имеет в виду, если вызывается PHP CLI или это ответ от веб-запроса. Лучшим способом было бы использовать php_sapi_name(), который, если бы он выполнял веб-запрос, мог бы эхо Apache, если это то, что он запускал.
В список нескольких, взятых из php docs на php_sapi_name():
Это должно обрабатывать все случаи (включая php-cgi)
return (php_sapi_name() === 'cli' OR defined('STDIN'));
Я использую эту функцию в течение нескольких лет
function is_cli()
{
    if ( defined('STDIN') )
    {
        return true;
    }
    if ( php_sapi_name() === 'cli' )
    {
        return true;
    }
    if ( array_key_exists('SHELL', $_ENV) ) {
        return true;
    }
    if ( empty($_SERVER['REMOTE_ADDR']) and !isset($_SERVER['HTTP_USER_AGENT']) and count($_SERVER['argv']) > 0) 
    {
        return true;
    } 
    if ( !array_key_exists('REQUEST_METHOD', $_SERVER) )
    {
        return true;
    }
    return false;
}
Дайте мне знать, что вы думаете
 php_sapi_name() действительно не лучший способ выполнить эту проверку, потому что это зависит от проверки множества возможных значений. Бинарный файл php-cgi можно вызывать из командной строки из оболочки script или в качестве задания cron и (в большинстве случаев) их также следует рассматривать как "cli", но php_sapi_name() будет возвращать разные значения для них ( обратите внимание, что это не относится к простой версии PHP, но вы хотите, чтобы ваш код работал где угодно, не так ли?). Не говоря уже о том, что в следующем году могут появиться новые способы использования PHP, которые мы не можем сейчас знать. Я бы предпочел не думать об этом, когда все, о чем я забочусь, это погода, я должен обернуть свой вывод в HTML или нет.
К счастью, PHP имеет возможность проверить это специально. Просто используйте http_response_code() без каких-либо параметров, и он вернет TRUE, если он запущен из среды типа веб-сервера, и FALSE, если он запущен из среды типа CLI. Вот код:
$is_web=http_response_code()!==FALSE;
Это будет работать, если вы случайно (?) установите код ответа из script, запущенного из CLI (или что-то вроде CLI), прежде чем вы вызовете это.
function is_cli() {
    return !http_response_code();
}
Пример:
if (is_cli()) {
    echo 'command line';
} else {
    echo 'browser';
}
Попробуйте
isset($_SERVER['REQUEST_METHOD'])
если он установлен, вы находитесь в браузере.
Альтернативно, вы можете проверить,
isset($_SERVER['argv'])
но это может быть неверно для окон CLI, IDK.
Я использовал это:
php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)
Это из Drush codebase, environment.inc, где у них есть аналогичная проверка.
Согласно http://jp2.php.net/manual/en/features.commandline.php Есть несколько констант, заданных только при запуске из CLI. Этими константами являются STDIN, STDOUT и STDERR. Тестирование одного из них скажет вам, находится ли он в режиме cli
Я бы предложил проверить, установлены ли некоторые из элементов массива $_ SERVER.
например:.
if (isset($_SERVER['REQUEST_METHOD'])) {
        print "HTTP request\n";
} else {
        print "CLI invocation\n";
}
Мой предпочтительный метод:
if (array_key_exists('SHELL', $_ENV)) {
  echo "Console invocation";
}
else {
  echo "HTTP invocation";
}
// Detect CLI calls
define("IS_CLI_CALL",( strcmp(php_sapi_name(),'cli') == 0 ));
if(IS_CLI_CALL){
   //do you stuff here
}
joomla way
if (array_key_exists('REQUEST_METHOD', $_SERVER)) die();
Простым способом является опрос переменной $argv (что вы, вероятно, будете делать для параметров командной строки). Даже если нет параметров $argv возвращает пустой массив.
Если он установлен, то использовался cli. Затем вы можете предположить, что все другие вызовы осуществляются через какой-либо веб-сервер или другой.
например:
if (isset($argv)) {
  // Do the cli thing.
}
Я бы попробовал:
echo exec('whoami');
Обычно веб-серверы запускаются под другим именем пользователя, поэтому это должно быть сказано.