【问题标题】:PHP script - detect whether running under linux or Windows?PHP 脚本 - 检测是否在 linux 或 Windows 下运行?
【发布时间】:2011-08-18 06:05:27
【问题描述】:

我有一个 PHP 脚本,可以放在 windows 系统或 linux 系统上。无论哪种情况,我都需要运行不同的命令。

如何检测我所处的环境? (最好是 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 是最易读的。

标签: php windows linux operating-system detect


【解决方案1】:

检查PHP_OS constantDocs的值。

它将在 Windows 上为您提供各种值,例如 WIN32WINNTWindows

另请参阅:Possible Values For: 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 会有什么价值?我看不到文档中的任何内容。
  • stripos(PHP_OS, 'WIN') === 0 可以改为使用,可以说更易读/更简单。
  • @dw1 - 它仍然可以在开始搜索“win”时工作。
  • 有了 php8 我们现在有了if (str_starts_with(strtoupper(PHP_OS), 'WIN')) {
【解决方案2】:

您可以检查目录分隔符是/(适用于unix/linux/mac)还是Windows 上的\。常量名是DIRECTORY_SEPARATOR

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

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

【讨论】:

  • 很遗憾,这不适用于 Windows 7 和 Zend Server。在这种情况下 DIRECTORY_SEPARATOR 也是 '\'
  • @Achim 你是什么意思? Zend Server 是服务器软件,而不是操作系统。 Windows 7 应该返回 \.
  • strpos(__FILE__,92) 利用了相同的行为; PATH_SEPARATOR>":" 对于 Windows 也返回 true(PATH_SEPARATOR 在所有其他操作系统上为“:”)。
  • 把它变成了一个函数:function is_linux(){return (DIRECTORY_SEPARATOR == '/') ? true : false;}
【解决方案3】:
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 的服务器!”这不是真的。
  • 嗯,这并不完全正确。请注意,strncasecmp 采用 n 个字符,而不仅仅是任何 n 个字符。如果您尝试过,您会发现 strncasecmp('DARWIN', 'WIN', 3) == 0 的计算结果为 false
【解决方案4】:

从 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";
}

请参阅official PHP documentation 了解它的可能值。

【讨论】:

【解决方案5】:

请注意PHP_OS reports the OS that PHP was built on,它不一定与当前运行的操作系统相同。

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

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');

【讨论】:

  • 1.正确的不是构建 PHP 的地方,而是构建 FOR 2 的地方。这同样适用于定义的窗口相关常量...
  • 反正为 Windows 构建的 PHP 不能在 unix 上运行,可以吗?
【解决方案6】:

php_uname 函数可用于检测这一点。

echo php_uname();

【讨论】:

    【解决方案7】:

    根据Predefined Constants: User Contributed Notes 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
    }
    

    【讨论】:

      【解决方案8】:

      这应该在 PHP 4.3+ 中工作:

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

      【讨论】:

        【解决方案9】:

        检测是 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 慢一点,但对于这么小的任务来说它足够高效,而且更优雅。

        【讨论】:

        • 虽然代码很简单,但这个答案并不独立:一个好的答案不会强迫人们在来自搜索引擎时阅读问题,因为它是独立的。
        【解决方案10】:

        核心预定义常量: 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 Server Name from Command Line

        你可以使用

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

        所以

        php_uname("s")
        

        's':操作系统名称。例如。 FreeBSD。

        会为您解决问题,请参阅此处http://php.net/manual/en/function.php-uname.php

        【讨论】:

          【解决方案11】:

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

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

          以前,这种方法用于 Symfony。现在他们使用different method

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

          【讨论】:

            【解决方案12】:

            如果要检查是否在Linux下运行,只需测试(PHP_OS === 'Linux')。无需使用 strtolower() 和 substr()。

            【讨论】:

              【解决方案13】:
              function isWin(){
               if (strtolower(substr(PHP_OS, 0, 3)) === 'win' || PHP_SHLIB_SUFFIX == 'dll' || PATH_SEPARATOR == ';') {
                  return true;
               } else {
                  return false;
               }
              }
              

              【讨论】:

                猜你喜欢
                • 2011-05-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-10-23
                • 2012-07-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多