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%未満のようです。3つのソリューションはすべて約100ナノ秒しかかからないため、とにかくこれはマイクロ最適化になります。だからあなたが好きなソリューションを選択してください。最後に、それが\strncasecmp(\PHP_OS, 'WIN', 3) === 0最も読みやすいと主張するかもしれません。
CAW

回答:


228

PHP_OS定数Docsの値を確認します。

それはあなたのようなWindows上でさまざまな値を与えるWIN32WINNTまたはWindows

以下も参照してください:可能な値:PHP_OSおよびphp_unameDocs

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の場合、どのような価値がありますか?私が見ることができるドキュメントには何もありません。
シャビーローブ


8
stripos(PHP_OS, 'WIN') === 0代わりに、おそらくより読みやすく/簡単に使用できます。
ジョンハント

1
@ dw1-最初に「win」を検索するため、引き続き機能します。
ジョンハント

62

ディレクトリセパレータが/(unix / linux / macの場合)または\Windowsにあるかどうかを確認できます。定数名はDIRECTORY_SEPARATORです。

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

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

残念ながら、これはWindows 7およびZend Serverでは機能しません。この場合、DIRECTORY_SEPARATORも '\'になります
Achim

4
@Achimどういう意味?Zend Serverはサーバーソフトウェアであり、OSではありません。Windows 7 \ 返すはずです。
mpen 2014

1
strpos(__FILE__,92)同じ振る舞いを利用します。PATH_SEPARATOR>":"Windowsの場合もtrueを返します(他のすべてのOSではPATH_SEPARATORは ":"です)。
タイタス

これを関数に変換しました:function is_linux(){return (DIRECTORY_SEPARATOR == '/') ? true : false;}
Mario Lurig '06 / 10/06

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サーバーでは「これはWindowsを使用するサーバー!」これは真実ではありません。
OMA

13
まあ、これはまったく真実ではありません。strncasecmp 任意のn文字ではなく、最初のn文字を取ることに注意してください。試してみると、がに評価されることがわかります。strncasecmp('DARWIN', 'WIN', 3) == 0false
オンドレイBouda

18

PHP_OSは、PHPが構築されたOSを報告することに注意してください。これは、現在実行されているOSと同じであるとは限りません。

PHP> = 5.3を使用していて、Windowsで実行しているかどうかを知る必要がある場合は、Windows固有の定数の 1つが定義されているかどうかをテストすることをお勧めします。例:

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');

4
1.正しいのは、PHPがビルドされた場所ではなく、FORでビルドされたものです。これは、定義されたウィンドウに関連する定数に同じように適用されます...
StanE

とにかく、Windows用にビルドされたPHPをUNIX上で実行することはできませんか?
Stalinko


7

よると、定義済み定数:ユーザーは、Notes貢献フォルカーさんと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.phpにはPHP_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に定数が存在するかどうかを確認できます(手動

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

以前は、このメソッドはsymfonyで使用されていました。今、彼らは別の方法を使用しています:

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

0

Linuxで実行しているかどうかを確認したい場合は、テストしてください(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.