Мені потрібно визначити, чи поточне виклик 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-fcgiString. Якщо ви завантажите скрипт як веб-сторінку з браузера, ви отримаєте apache2handler. Сподіваюся, це допомагає. Мені потрібно використовувати php-cgiдля того , щоб ввести $_GETзмінні: php-cgi myscript.php arg1=one arg2=two. Тестування на не рівне значення apache2handlerповинно бути нормальним apache.
"cli"коли буде запущено з роботи з кроном. Існує кілька клавіш, які можна вибрати зсередини, $_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;ВАТ?
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()них повертаються різні значення (зверніть увагу, що це не " t справа в звичайній версії 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 документів наphp_sapi_name() :
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(навіть у cli env), тоді це спрацює. Особисто я використовую$isCli = \defined('STDIN') || isset($_SERVER['argv']) || \array_key_exists('REQUEST_METHOD', $_SERVER)
Я використав це:
php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)
Це з кодової бази даних Drush, Environment.inc, де вони мають зробити аналогічну перевірку.
Спробуйте
isset($_SERVER['REQUEST_METHOD'])
якщо це встановлено, ви перебуваєте в браузері.
Крім того, ви можете перевірити, чи немає
isset($_SERVER['argv'])
але це може бути неправдою для Windows CLI, IDK.
Відповідно до http://jp2.php.net/manual/en/features.commandline.php Існує ряд констант, встановлених лише під час запуску з CLI. Такими константами є STDIN, STDOUT та STDERR. Тестування для одного з них підкаже, чи перебуває він у режимі cli
Мій кращий метод:
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, або як фонове завдання іншого демона - у такому випадку я пропоную додатково перевірити, чи STDINє TTY:
function at_tty() {
return defined("\STDIN") && posix_isatty(\STDIN);
}
Я б спробував:
echo exec('whoami');
Зазвичай веб-сервери працюють під іншим ім'ям користувача, так що це має бути важливо.