PHP 스크립트의 명령 행과 http 실행을 결정하는 정식 방법은 무엇입니까?


155

주로 출력 형식화 목적으로 명령 행 또는 HTTP를 통해 실행되는지 확인해야하는 PHP 스크립트가 있습니다. 이 작업을 수행하는 정식 방법은 무엇입니까? 나는 그것이 inspect이라고 생각 SERVER['argc']했지만 'Apache 2.0 Handler'서버 API를 사용할 때조차도 채워져 있음이 밝혀졌습니다.

답변:


228

php_sapi_name()기능을 사용하십시오 .

if (php_sapi_name() == "cli") {
    // In cli-mode
} else {
    // Not in cli-mode
}

다음은 문서의 관련 참고 사항입니다.

php_sapi_name — 웹 서버와 PHP 사이의 인터페이스 유형을 반환

철저하지는 않지만 가능한 반환 값에는 aolserver, apache, apache2filter, apache2handler, caudium, cgi (PHP 5.3까지), cgi-fcgi, cli, cli-server, continuity, embed, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux 및 webjames.

PHP> = 4.2.0에는와 PHP_SAPI같은 값을 갖는 미리 정의 된 상수도 php_sapi_name()있습니다.


감사. 나는 왜 의사에게 흥미가 있습니다. 예제에서는 처음 3자를 검사하지만 설명에서는 문자열이 정확히 "cgi"여야하지만 그 외에는 이것이 완벽하다고 생각합니다.
Bobby Jack

물론 반환 된 문자열이 'cgi'가 아닌 경우 콘솔에서 PHP가 실행되고 있음을 나타냅니다. whaddayaknow, 내 경우와 마찬가지로.
Adriano Varoli Piazza

@ Adriano : 아마도 php-cgi를 사용하여 스크립트를 실행할 수 있습니다.

3
@Bobby, php.net 문서의 예제는 실제로 문자열의 처음 세 문자를 보면 "cgi"와 "cgi-fcgi"와 모두 일치합니다. 그 이유는 실제로 의미가 있습니다. 만약 PHP를 호출하기 위해 @hop을 돌려 받으면 심각한 프로그래머에게는 아무 언어도 없다 : D
ChrisR

1
흥미로운 참고 사항은 다음과 같습니다. php.net/manual/en/function.php-sapi-name.php 는 호출 된 실제 바이너리에 따라 명령 행에서 php를 실행하고 여전히 cgi-fgi를 얻을 수 있다는 것입니다
DAB

22

이것은 항상 작동합니다. (PHP 버전이 4.2.0 이상인 경우)

define('CLI', PHP_SAPI === 'cli');

스크립트 상단에서 쉽게 사용할 수 있습니다.

<?php PHP_SAPI === 'cli' or die('not allowed');

8
두 번째 조각은 내가 기대하는 불합리한 추론 것 같아CLI or die('not allowed');
Madbreaks

1
@Madbreaks, 나는 두 가지 용도를 진술했다. 나는 둘 중 하나를 가정하고 있었지만 둘 다 사용하면 CLI or die('not allowed');완벽합니다.
Xeoncross

명확히 해 주셔서 감사합니다, +1
Madbreaks

7
Which makes it easy to use at the top of your scripts실제로 두 가지 용도로 들리는 것은 아닙니다. 네, 저는 네크로맨서입니다.
George Dimitriadis 2016 년


8

나는 생각한다

$_SERVER['REMOTE_ADDR']

CLI에서 채워지지 않습니다.

또한 $ _SERVER superglobal의 모든 HTTP_ * 키가 CLI에서 채워지지 않거나 방금 언급 한 올바른 방법으로 홉을 사용하십시오 :-)


4

php_sapi_name 설명서 페이지 에는 작동 방식이 명확하게 나와 있습니다.

PHP가 사용하는 인터페이스 유형 (서버 API, SAPI)을 설명하는 소문자 문자열을 반환합니다.

철저하지는 않지만 가능한 반환 값에는 aolserver, apache, apache2filter, apache2handler, caudium, cgi (PHP 5.3까지), cgi-fcgi, cli, continuity, embed, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux 및 webjames.

왜 홉이 PHP가 심각한 프로그래머를위한 것이라고 생각하지 않는지 잘 모르겠습니다 (저는 심각한 프로그래머이며 매일 PHP를 사용합니다). PHP가 실행될 수 있고 각 서버에 대해 가능한 모든 인터페이스 유형의 이름을 결정할 수 있습니다. 새 웹 서버 및 인터페이스가 추가 될 때 해당 목록을 업데이트하십시오.

또한 바비는 이렇게 말했습니다.

나는 왜 의사에게 흥미가 있습니다. 예는 설명에서 문자열이 정확히 "CGI"여야한다고 설명하는 동안 처음 3자를 검사합니다.

예제에 대한 설명은 다음과 같습니다.

이 예에서는 cgi-fcgi 일 수도 있으므로 하위 문자열 cgi를 확인합니다.


아-그 날 나는 그다지 눈에 띄지 않았거나 그 의견을 제시 한 이후에 예가 업데이트되었습니다. PHP에 대한 당신의 의견에 전적으로 동의하십시오. 강타는 매우 피곤합니다.
Bobby Jack
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.