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

Answers:


228

检查PHP_OS常量Docs的值。

它会给你不同的值在Windows一样WIN32WINNTWindows

另请参见:可能的值:PHP_OSphp_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,它将具有什么价值?我看不到任何文档。
Shabbyrobe


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是服务器软件,而不是操作系统。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

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 2012年

13
好吧,这不是真的。注意,这strncasecmp需要 n个字符,而不仅仅是任何n个字符。如果您尝试过,则会发现结果strncasecmp('DARWIN', 'WIN', 3) == 0false
的Ondrej布达

18

需要注意的是PHP_OS报告操作系统,PHP是建立,这是不一定相同的操作系统,它当前正在运行。

如果您使用的是PHP> = 5.3,并且只需要知道您是否在Windows上运行-Windows,则可以测试是否定义了Windows特定的常量之一,例如:

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');

4
1.正确的位置不是在PHP上建立的,而是在FOR 2上建立的。这适用于已定义的与窗口相关的常数,其
用法

无论如何,为Windows构建的PHP不能在UNIX上运行,可以吗?
Stalinko '16


7

根据“ 预定义常量:用户贡献的注释”, Volker和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)常数。

或者,如果您要检测客户端的操作系统,请执行以下操作:

<?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
}


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.