Мне нужно определить, является ли текущий вызов 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');
}
return php_sapi_name() == 'cli';
php-cgi
этим, это не сработает. В свою очередь, он вернет cgi-fcgi
String. Если вы загрузите скрипт как веб-страницу из браузера, вы получите apache2handler
. Надеюсь это поможет. Мне нужно было использовать php-cgi
, чтобы представить$_GET
переменные: php-cgi myscript.php arg1=one arg2=two
. Тестирование на не равно apache2handler
должно быть в порядке apache
.
"cli"
при запуске из задания cron. Существует несколько различных ключей, которые можно выбрать изнутри, $_SERVER
чтобы более надежно определить, поступил ли запрос по HTTP или нет.
Я использую эту функцию в течение нескольких лет
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;
}
array_key_exists('REQUEST_METHOD', $_SERVER) return true;
WAT?
array_key_exists('REQUEST_METHOD', $_SERVER)
правильна, чтобы помочь определить источник запроса . Когда в CLI , то $_SERVER
супер Global массив НЕ ИМЕЕТ ключ REQUEST_METHOD
, он существует только тогда , когда делается запрос через Интернет, следовательно, автор абсолютно на цель при его проверке.
return false;
делать if ( ! array_key_exists(…)) return true;
?
'REQUEST_METHOD'
будет НЕ найден, то функция должна возвращать FALSE
указать «CLI». Приношу свои извинения за то, что не обратил внимания на область действия самой функции ... Автор должен исправить это, потому что функция действительно работает!
php_sapi_name()
действительно не лучший способ выполнить эту проверку, потому что это зависит от проверки на множество возможных значений. Бинарный файл php-cgi может быть вызван из командной строки, из сценария оболочки или как задание cron, и (в большинстве случаев) их также следует рассматривать как 'cli', ноphp_sapi_name()
будут возвращаться разные значения (обратите внимание, что это не в случае простой версии PHP, но вы хотите, чтобы ваш код работал где угодно, верно?). Не говоря уже о том, что в следующем году могут появиться новые способы использования PHP, о которых мы не можем знать сейчас. Я бы предпочел не думать об этом, когда все, что меня волнует, это погода, я должен обернуть вывод в HTML или нет.
К счастью, в PHP есть способ проверить это специально. Просто используйте http_response_code()
без каких-либо параметров, и он вернет TRUE, если он запускается из среды типа веб-сервера, и FALSE, если он запускается из среды типа CLI. Вот код:
$is_web=http_response_code()!==FALSE;
Это даже будет работать, если вы случайно (?) Установили код ответа из скрипта, запущенного из CLI (или что-то вроде CLI), прежде чем вызывать это.
http_response_code()
устанавливает код / возвращает установленный код при запуске из CLI. Проверено <?php function t() { echo var_export(http_response_code(), true) . ' -> ' . (http_response_code() !== false ? 'web' : 'cli') . "\n"; } t(); http_response_code(200); t(); http_response_code(false); t();
. Так что, если http_response_code()===false
тогда это безопасная ставка, чтобы принять CLI, но если нет, вам нужно проверить и другие метрики.
Я думаю, он имеет в виду, вызывается ли PHP CLI или это ответ от веб-запроса. Лучшим способом было бы использовать, php_sapi_name()
который, если бы он выполнял веб-запрос, повторил бы Apache, если это то, что он выполнял.
К списку нескольких взятых из документации поphp_sapi_name()
php :
function is_cli() {
return !http_response_code();
}
пример:
if (is_cli()) {
echo 'command line';
} else {
echo 'browser';
}
http_response_code(200);
... если я сейчас позвоню, http_response_code()
он вернет 200;
http_response_code();
вызывается из среды CLI, он всегда возвращает FALSE независимо от фактического кода состояния. Я уже объяснил это в своем ответе, но вы могли бы также узнать это, прочитав страницу руководства в разделе «Возвращаемые значения» или попробовав это.
php -r 'http_response_code(200); echo http_response_code()."\n";'
выводит «200» Если вы не можете гарантировать, что какая-то библиотека или невежественный фреймворк не установит код ответа http_response_code
(даже в среде), тогда это будет работать. Лично я использую$isCli = \defined('STDIN') || isset($_SERVER['argv']) || \array_key_exists('REQUEST_METHOD', $_SERVER)
Я использовал это:
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
Joomla Way
if (array_key_exists('REQUEST_METHOD', $_SERVER)) die();
Я бы посоветовал проверить, есть ли некоторые записи в $ _SERVER массива .
Например:
if (isset($_SERVER['REQUEST_METHOD'])) {
print "HTTP request\n";
} else {
print "CLI invocation\n";
}
php-cgi
командной строкой, оно будет установлено GET
для:php-cgi -f file.php arg1=2
Мой предпочтительный метод:
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
}
Самый простой способ - опросить $argv
переменную (что вы, вероятно, все равно будете делать для параметров командной строки). Даже если параметров нет, $argv
возвращается пустой массив.
Если он установлен, то использовался cli. Затем вы можете предположить, что все другие вызовы выполняются через какой-либо веб-сервер или другой.
например:
if (isset($argv)) {
// Do the cli thing.
}
Исходя из ответа Silver Moon выше , я использую эту функцию для возврата правильных разрывов строк:
/**
* 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>";
}
Правильный ответ на этот вопрос зависит от реальных намерений:
Если в первом случае даны ответы и комментарии, достаточно найти решение, которое работает.
Если последнее, приведенные здесь рецепты потерпят неудачу, если инструмент запускается как cronjob или background-job от другого демона - в этом случае я предлагаю дополнительно проверить, STDIN
является ли TTY:
function at_tty() {
return defined("\STDIN") && posix_isatty(\STDIN);
}
Я бы попробовал:
echo exec('whoami');
Обычно веб-серверы запускаются под другим именем пользователя, так что это должно показывать.