현재 PHP 호출이 명령 줄 (CLI) 또는 웹 서버 (내 경우에는 mod_php를 사용하는 Apache)에서 호출되는지 확인해야합니다.
권장되는 방법이 있습니까?
현재 PHP 호출이 명령 줄 (CLI) 또는 웹 서버 (내 경우에는 mod_php를 사용하는 Apache)에서 호출되는지 확인해야합니다.
권장되는 방법이 있습니까?
답변:
php_sapi_name
인터페이스 유형의 소문자 문자열을 반환하므로 사용하려는 함수입니다. 또한 PHP 상수가 PHP_SAPI
있습니다.
http://php.net/php_sapi_name 에서 설명서를 찾을 수 있습니다.
예를 들어 CLI에서 PHP가 실행 중인지 확인하려면이 함수를 사용할 수 있습니다.
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"
. $_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 는 슈퍼 글로벌 배열 것 NOT 키를 가질 , 그것은 단지 요청이 웹을 통해 이루어 될 때 검사 할 때, 따라서 저자는 대상에 절대적으로 존재한다. $_SERVER
REQUEST_METHOD
return false;
나하지 if ( ! array_key_exists(…)) return true;
?
'REQUEST_METHOD'
있다 NOT 발견, 다음 함수는 반환해야 FALSE
"CLI"를 나타냅니다. 함수 자체의 범위에주의를 기울이지 않은 것에 대해 사과드립니다 ... 함수가 실제로 작동하기 때문에 저자가 수정해야합니다!
php_sapi_name()
이 검사를 수행하는 가장 좋은 방법은 아닙니다. 가능한 많은 값에 대한 검사에 의존하기 때문입니다. php-cgi 바이너리는 커맨드 라인, 쉘 스크립트 또는 크론 작업으로 호출 할 수 있으며 (대부분의 경우) 이것들은 'cli'로 취급되어야하지만 php_sapi_name()
이것들에 대해 다른 값을 반환합니다 (이것은 일반 버전의 PHP에서는 그렇지 않지만 코드가 어디서나 작동하기를 원하십니까?). 내년에는 말할 것도없이 현재로서는 알 수없는 PHP를 사용하는 새로운 방법이있을 수 있습니다. 내가 관심있는 모든 것이 날씨 인 경우 HTML로 출력을 래핑 해야하는지 여부에 대해 생각하지 않습니다.
다행히도 PHP는이를 구체적으로 확인할 수있는 방법이 있습니다. http_response_code()
매개 변수없이 사용 하면 웹 서버 유형 환경에서 실행되면 TRUE를, CLI 유형 환경에서 실행하면 FALSE를 반환합니다. 코드는 다음과 같습니다.
$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가 실행중인 경우 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)
http://jp2.php.net/manual/en/features.commandline.php 에 따르면 CLI에서 실행할 때만 여러 상수가 설정됩니다. 이 상수는 STDIN, STDOUT 및 STDERR입니다. 그 중 하나에 대한 테스트는 그것이 cli 모드인지 여부를 알려줍니다.
// Detect CLI calls
define("IS_CLI_CALL",( strcmp(php_sapi_name(),'cli') == 0 ));
if(IS_CLI_CALL){
//do you stuff here
}
위의 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);
}