PHP 스크립트-Linux 또는 Windows에서 실행 중인지 감지합니까?


143

Windows 시스템 또는 Linux 시스템에 배치 할 수있는 PHP 스크립트가 있습니다. 두 경우 모두 다른 명령을 실행해야합니다.

내가 어떤 환경에 있는지 어떻게 알 수 있습니까? (영리한 시스템 해킹보다는 PHP가 바람직합니다)

최신 정보

명확히하기 위해 스크립트는 명령 행에서 실행 중입니다.


벤치 마크를 수행 한 후, 그 사이의 성능이 차이를 보인다 \strncasecmp(\PHP_OS, 'WIN', 3) === 0, \strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN'그리고 \stripos(\PHP_OS, 'WIN')15 % 이하이다. 세 가지 솔루션은 모두 대략 100 나노초 밖에 걸리지 않으므로 어쨌든 마이크로 최적화가 될 것입니다. 원하는 솔루션을 선택하십시오. 마지막으로, \strncasecmp(\PHP_OS, 'WIN', 3) === 0가장 읽기 쉽다고 주장 할 수 있습니다 .
caw

답변:


228

PHP_OS상수 Docs 값을 확인하십시오 .

그것은 윈도우와 같은 당신에게 다양한 값을 줄 것이다 WIN32, WINNT또는 Windows.

뿐만 아니라 참조 : 가능한 값을 경우 : PHP_OSphp_uname문서 도구 :

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    echo 'This is a server using Windows!';
} else {
    echo 'This is a server not using Windows!';
}

Windows라면 어떤 가치가 있습니까? 내가 볼 수있는 문서에는 아무것도 없습니다.
Shabbyrobe


8
stripos(PHP_OS, 'WIN') === 0대신 더 읽기 쉽고 간단하게 사용할 수 있습니다.
John Hunt

1
@ dw1-처음에 "win"을 검색 할 때 여전히 작동합니다.
존 헌트

62

디렉토리 구분 기호가 /(unix / linux / mac의 경우) 또는 \창에 있는지 확인할 수 있습니다 . 상수 이름은 DIRECTORY_SEPARATOR입니다.

if (DIRECTORY_SEPARATOR === '/') {
    // unix, linux, mac
}

if (DIRECTORY_SEPARATOR === '\\') {
    // windows
}

불행히도 이것은 Windows 7 및 Zend Server에서 작동하지 않습니다. 이 경우 DIRECTORY_SEPARATOR도 '\'입니다
Achim

4
@Achim 무슨 뜻인가요? Zend 서버는 OS가 아닌 서버 소프트웨어입니다. Windows 7 \ 반환 해야합니다 .
mpen

1
strpos(__FILE__,92)동일한 행동을 이용합니다. PATH_SEPARATOR>":"Windows에서도 true를 리턴합니다 (다른 모든 OS에서 PATH_SEPARATOR는 ":"임).
Titus

이것을 기능으로 바 function is_linux(){return (DIRECTORY_SEPARATOR == '/') ? true : false;}
꾸었습니다

37
if (strncasecmp(PHP_OS, 'WIN', 3) == 0) {
    echo 'This is a server using Windows!';
} else {
    echo 'This is a server not using Windows!';
}

허용 된 답변보다 조금 더 우아해 보입니다. DIRECTORY_SEPARATOR를 사용한 앞서 언급 한 탐지가 가장 빠릅니다.


죄송하지만 Mac 서버를 사용하는 경우 제대로 작동하지 않습니다. Mac에서는 "DARWIN"이 포함 된 문자열 ( "WIN"도 포함)이 표시되므로 Mac 서버에서는 "This is Windows를 사용하는 서버! " 사실이 아닙니다.
OMA

13
글쎄, 이것은 사실이 아닙니다. 공지 strncasecmp소요 처음 n 개의 문자뿐 아니라 모든 n 개의 문자를. 당신이 그것을 시도한다면, 당신은 strncasecmp('DARWIN', 'WIN', 3) == 0~로 평가되는 것을 알 것입니다 false.
Ondřej Bouda

18

참고 PHP_OS는 PHP가되었다는 OS보고 내장 반드시 현재 실행되고있는 동일한 OS 아니다.

PHP가 5.3 이상이고 Windows에서 실행 중인지 여부를 알아야하는 경우 Windows 관련 상수 중 하나 가 정의되어 있는지 테스트 하는 것이 좋습니다. 예 :

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');

4
1. 올바른 것은 PHP가 구축 된 곳이 아니라 그것을 위해 구축 된 것입니다. 2. 이것은 정의 된 창 관련 상수에 동일한 방식으로 적용됩니다 ...
StanE

어쨌든 Windows 용으로 작성된 PHP는 유닉스에서 실행할 수 없습니다.
Stalinko


7

에 따라 미리 정의 된 상수 : 사용자가 노트 기여 폴커의와 rdcapasso 솔루션, 당신은 단순히 다음과 같이 헬퍼 클래스를 생성 할 수 있습니다 :

<?php

class System {

    const OS_UNKNOWN = 1;
    const OS_WIN = 2;
    const OS_LINUX = 3;
    const OS_OSX = 4;

    /**
     * @return int
     */
    static public function getOS() {
        switch (true) {
            case stristr(PHP_OS, 'DAR'): return self::OS_OSX;
            case stristr(PHP_OS, 'WIN'): return self::OS_WIN;
            case stristr(PHP_OS, 'LINUX'): return self::OS_LINUX;
            default : return self::OS_UNKNOWN;
        }
    }

}

용법:

if(System::getOS() == System::OS_WIN) {
  // do something only on Windows platform
}

6

이것은 PHP 4.3 이상에서 작동합니다 :

if (strtolower(PHP_SHLIB_SUFFIX) === 'dll')
{
    // Windows
}
else
{
    // Linux/UNIX/OS X
}

5

PHP 7.2.0부터는 상수를 사용하여 실행중인 OS를 감지 할 수 있습니다 PHP_OS_FAMILY.

if (PHP_OS_FAMILY === "Windows") {
  echo "Running on Windows";
} elseif (PHP_OS_FAMILY === "Linux") {
  echo "Running on Linux";
}

가능한 값 은 공식 PHP 문서 를 참조하십시오 .


4

핵심 사전 정의 상수 : 상수 가있는 http://us3.php.net/manual/en/reserved.constants.phpPHP_OS (string)

또는 클라이언트의 OS를 감지하려는 경우 :

<?php
    echo $_SERVER['HTTP_USER_AGENT'] . "\n\n";

    $browser = get_browser(null, true);
    print_r($browser);
?>

에서 http://us3.php.net/manual/en/function.get-browser.php


편집에 따르면 명령 줄 에서이 복제 된 PHP 서버 이름을 참조 할 수 있습니다

당신이 사용할 수있는

string php_uname ([ string $mode = "a" ] )

그래서

php_uname("s")

's': 운영 체제 이름 예. FreeBSD.

당신을 위해 트릭을 할 것입니다, 여기를 참조하십시오 http://php.net/manual/en/function.php-uname.php


4

Windows, OS X 또는 Linux인지 감지하려면 다음을 수행하십시오.

if (stripos(PHP_OS, 'win') === 0) {
    // code for windows
} elseif (stripos(PHP_OS, 'darwin') === 0) {
    // code for OS X
} elseif (stripos(PHP_OS, 'linux') === 0) {
    // code for Linux
}

stripossubstr이 특별한 경우 보다 약간 느리지 만 작은 작업에 충분하고 효율적입니다.


코드는 충분히 간단하지만이 답변은 그 자체로 설득력이 없습니다. 훌륭한 답변은 자체적으로 포함되어 있기 때문에 검색 엔진에서 올 때 질문을 읽도록 강요하지 않습니다.
jpaugh

2

PHP> 5.3.0에 상수가 있는지 확인할 수 있습니다 ( manual )

if (defined('PHP_WINDOWS_VERSION_BUILD')) {
    // is Windows
}

이전에는이 ​​방법이 Symfony에서 사용되었습니다. 이제 그들은 다른 방법 을 사용합니다 .

if ('\\' === DIRECTORY_SEPARATOR) {
    // is Windows
}

0

Linux에서 실행 중인지 확인하려면 if 만 테스트하십시오 (PHP_OS === 'Linux'). strtolower () 및 substr ()을 사용할 필요가 없습니다.


-1
function isWin(){
 if (strtolower(substr(PHP_OS, 0, 3)) === 'win' || PHP_SHLIB_SUFFIX == 'dll' || PATH_SEPARATOR == ';') {
    return true;
 } else {
    return false;
 }
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.