PHP脚本 - 检测是在linux还是Windows下运行?

sil*_*npi 131 php linux windows operating-system detect

我有一个PHP脚本,可以放在Windows系统或Linux系统上.在任何一种情况下我都需要运行不同的命令.

我如何检测我所处的环境?(最好用PHP而不是聪明的系统黑客)


实在抱歉!!脚本从命令行运行!!!!

San*_*hal 215

检查PHP_OS常量文档的值.

它会在Windows上为您提供各种值WIN32,WINNT或者Windows.

请参阅:可能的值: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!';
}
Run Code Online (Sandbox Code Playgroud)

  • Shabbyrobe:请参阅http://stackoverflow.com/questions/738823/possible-values-for-php-os (6认同)
  • 可以使用`stripos(PHP_OS,'WIN')=== 0`,可以说更具可读性/简单性。 (5认同)

Ibu*_*Ibu 57

您可以检查目录分隔符/(对于unix/linux/mac)还是\在Windows上.常量名称为DIRECTORY_SEPARATOR

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

if (DIRECTORY_SEPARATOR === '\\') {
    // windows
}
Run Code Online (Sandbox Code Playgroud)

  • @Achim你是什么意思?Zend Server是服务器软件,而不是操作系统.Windows 7*应该*返回\. (3认同)
  • `strpos(__FILE__,92)` 利用相同的行为;`PATH_SEPARATOR>":"` 对 Windows 也返回 true(PATH_SEPARATOR 在所有其他操作系统上为“:”)。 (2认同)

Ond*_*uda 37

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

似乎比接受的答案更优雅.但是,使用DIRECTORY_SEPARATOR进行的上述检测是最快的.

  • 嗯,这不是真的.请注意,`strncasecmp`需要**第一个**_n_字符,而不仅仅是任何_n_字符.如果你尝试过,你会发现`strncasecmp('DARWIN','WIN',3)== 0`评估为'false`. (13认同)

jos*_*mmo 19

从 PHP 7.2.0 开始,您可以使用常量检测正在运行的操作系统PHP_OS_FAMILY

if (PHP_OS_FAMILY === "Windows") {
  echo "Running on Windows";
} elseif (PHP_OS_FAMILY === "Linux") {
  echo "Running on Linux";
}
Run Code Online (Sandbox Code Playgroud)

有关其可能的值,请参阅官方 PHP 文档


小智 16

需要注意的是PHP_OS报告说,PHP是操作系统内置,这不一定是当前运行在相同的操作系统.

如果您使用PHP> = 5.3并且只需要知道您是在Windows上运行还是不在Windows上运行,那么测试是否定义了一个特定Windows的常量可能是一个不错的选择,例如:

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');
Run Code Online (Sandbox Code Playgroud)

  • 1.正确的不是PHP建立在哪里,而是建立在FOR 2的内容.这适用于定义的窗口相关的常量相同的方式... (4认同)

And*_*ahl 8

php_uname功能,可以用来检测这一点.

echo php_uname();
Run Code Online (Sandbox Code Playgroud)


Jon*_*ill 6

这应该适用于PHP 4.3+:

if (strtolower(PHP_SHLIB_SUFFIX) === 'dll')
{
    // Windows
}
else
{
    // Linux/UNIX/OS X
}
Run Code Online (Sandbox Code Playgroud)


art*_*pro 5

要检测它是 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
}
Run Code Online (Sandbox Code Playgroud)

stripos比这个特殊情况要慢一些substr,但对于这样一个小任务来说它已经足够高效了,而且更优雅。


gho*_*404 5

您可以检查 PHP >5.3.0 中是否存在常量(手动

if (defined('PHP_WINDOWS_VERSION_BUILD')) {
    // is Windows
}
Run Code Online (Sandbox Code Playgroud)

此前,Symfony 中使用过此方法。现在他们使用不同的方法

if ('\\' === DIRECTORY_SEPARATOR) {
    // is Windows
}
Run Code Online (Sandbox Code Playgroud)


Pat*_*ski 5

根据“ 预定义常量:用户贡献的注释”, 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;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

用法:

if(System::getOS() == System::OS_WIN) {
  // do something only on Windows platform
}
Run Code Online (Sandbox Code Playgroud)