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

Posted

技术标签:

【中文标题】PHP 脚本 - 检测是不是在 linux 或 Windows 下运行?【英文标题】: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 是最易读的。 【参考方案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 会有什么价值?我看不到文档中的任何内容。 破旧衣服:见***.com/questions/738823/possible-values-for-php-os 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 了解它的可能值。

【讨论】:

@Stef 根据 3v4l,它仅适用于 PHP 7.2 3v4l.org/CBpG4【参考方案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;
 

【讨论】:

以上是关于PHP 脚本 - 检测是不是在 linux 或 Windows 下运行?的主要内容,如果未能解决你的问题,请参考以下文章

从 PHP 脚本检测是不是启用了 mbstring

Linux如何使用shell命令检测PHP木马防止脚本木马的破坏

Linux Shell 脚本:如何检测 NFS 挂载点(或服务器)已死?

求linux脚本,就是服务器自动检测网络,每个一段时间自动检测,丢包严重或断网,就自动重启服务器,求高手

java在linux中执行shell脚本,用telnet检测指定IP的端口是不是可以连接上

如何在 powershell 中检测 Linux 或 macOS 或 Windows?