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

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

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

更新</ h2>

为了澄清,脚本是从命令行运行的。</ p> \ n </ div>

展开原文

原文

I have a PHP script that may be placed on a windows system or a linux system. I need to run different commands in either case.

How can I detect which environment I am in? (preferably something PHP rather than clever system hacks)

Update

To clarify, the script is running from the command line.

doudu6100
doudu6100 执行基准测试后,似乎\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是最具可读性的。
大约一年之前 回复
dtyqeoc70733
dtyqeoc70733 我已经更新了我的答案
9 年多之前 回复
duanchi19820419
duanchi19820419 Arsenault-请看编辑!
9 年多之前 回复
duanji9677
duanji9677 @All有用吗?
9 年多之前 回复

14个回答



检查 PHP_OS </ code>常量文档</ em> </ sup> 。</ p>

它将在Windows上为您提供各种值,如 WIN32 </ code>, WINNT </ code>或 Windows </ code>。</ p>

请参阅 : 可能的值:PHP_OS </ em> php_uname </ code> Docs </ em> </ sup> :</ p>

  if(strtoupper(substr(PHP_OS,0,3))==='WIN'){
echo'这是一台使用Windows的服务器!';
} else {
echo'这是一台不使用的服务器 Windows!';
}
</ code> </ pre>
</ div>

展开原文

原文

Check the value of the PHP_OS constantDocs.

It will give you various values on Windows like WIN32, WINNT or Windows.

See as well: Possible Values For: PHP_OS and 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!';
}

dongsuoying9059
dongsuoying9059 - 它仍然有效,因为它在开始时搜索“胜利”。
接近 2 年之前 回复
dongzhi4690
dongzhi4690 stripos(PHP_OS,'WIN')=== 0可以代替使用,可以说更具可读性/简单性。
接近 2 年之前 回复
douju8113
douju8113 Shabbyrobe:请参阅stackoverflow.com/questions/738823/possible-values-for-php-os
9 年多之前 回复
douweinu8562
douweinu8562 如果它是Windows,它会有什么价值? 我可以看到文档中没有任何内容。
9 年多之前 回复



检测它是Windows,OS X还是Linux:</ p>

  if(stripos)  (PHP_OS,'win')=== 0){
// windows的代码
} elseif(stripos(PHP_OS,'darwin')=== 0){
// OS X的代码
} elseif(stripos(PHP_OS,'linux')=== 0){
// Linux代码
}
</ code> </ pre>

stripos </ code 在这种特殊情况下,>比 substr </ code>慢一点,但它对于这么小的任务来说足够有效,而且更加优雅。</ p>
</ div>

展开原文

原文

To detect whether it's Windows, OS X or 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
}

stripos is a bit slower than substr in this particular case, yet it's efficient enough for such a small task, and more elegant.

doude5860
doude5860 固定。 谢谢
大约 4 年之前 回复
duanchouyi6730
duanchouyi6730 尽管代码很简单,但这个答案并不是独立的:一个好的答案并不会强迫人们在来自搜索引擎时阅读问题,因为它是独立的。
大约 4 年之前 回复



php_uname 函数可以用来检测这个。</ p>

  echo php_uname(); 
</ code> </ pre>
</ DIV>

展开原文

原文

The php_uname function can be used to detect this.

echo php_uname();

According to Predefined Constants: User Contributed Notes Volker's and rdcapasso solution, you can simply create helper class like this:

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

}

Usage:

if(System::getOS() == System::OS_WIN) {
  // do something only on Windows platform
}

Core Predefined Constants: http://us3.php.net/manual/en/reserved.constants.php which has the PHP_OS (string) constant.

Or if you want to detect the OS of the client:

<?php
    echo $_SERVER['HTTP_USER_AGENT'] . "

";

    $browser = get_browser(null, true);
    print_r($browser);
?>

From http://us3.php.net/manual/en/function.get-browser.php


According to your edit you can refer to this dublicate PHP Server Name from Command Line

You can use

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

So

php_uname("s")

's': Operating system name. eg. FreeBSD.

Would do the trick for you, see here http://php.net/manual/en/function.php-uname.php

You can check if a constant exists in PHP >5.3.0 (manual)

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

Previously, this method was used in Symfony. Now they use a different method:

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



  if(strncasecmp(PHP_OS,'WIN',3)== 0){
echo'这是服务器 使用Windows!';
}其他{
echo'这是一台不使用Windows的服务器!';
}
</ code> </ pre>

看起来更优雅一点 比接受的答案。 但是,使用DIRECTORY_SEPARATOR进行的上述检测是最快的。</ p>
</ div>

展开原文

原文

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

seems like a bit more elegant than the accepted answer. The aforementioned detection with DIRECTORY_SEPARATOR is the fastest, though.

drqj8605
drqj8605 非常有趣。 好答案。
3 年多之前 回复
dongtuoao7987
dongtuoao7987 你是对的,我的坏......
接近 8 年之前 回复
douruduan8812
douruduan8812 嗯,这不是真的。 请注意,strncasecmp采用前n个字符,而不仅仅是n个字符。 如果你尝试过,你会发现strncasecmp('DARWIN','WIN',3)== 0的计算结果为false。
接近 8 年之前 回复
dongpai6552
dongpai6552 对不起,但如果您使用的是Mac服务器,则无法正常工作,因为在Mac中您会得到一个包含“DARWIN”的字符串,其中也包含“WIN”,因此在Mac服务器中您将获得“这是 使用Windows的服务器!“ 这不是真的。
接近 8 年之前 回复

Note that PHP_OS reports the OS that PHP was built on, which is not necessarily the same OS that it is currently running on.

If you are on PHP >= 5.3 and just need to know whether you're running on Windows or not-Windows then testing whether one of the Windows-specific constants is defined may be a good bet, e.g.:

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');
dowjgrm6787
dowjgrm6787 无论如何,为Windows构建的PHP无法在unix上运行,可以吗?
接近 4 年之前 回复
dongweishi2028
dongweishi2028 1.正确的不是PHP建立在哪里,而是建立在FOR 2的内容。这适用于定义的窗口相关的常量相同的方式...
大约 6 年之前 回复



您可以检查目录分隔符是 / </ code>(对于unix / linux / mac)还是 Windows上的</ code>。 常量名称是DIRECTORY_SEPARATOR </ p>

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

if(DIRECTORY_SEPARATOR ==' \'){
// windows
}
</ code> </ pre>
</ div>

展开原文

原文

You can check if the directory seperator is / (for unix/linux/mac) or \ on windows. The constant name is DIRECTORY_SEPARATOR

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

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

douwen3500
douwen3500 把它变成一个函数:function is_linux(){return(DIRECTORY_SEPARATOR =='/')? 真假;}
接近 3 年之前 回复
dongpo8250
dongpo8250 strpos(__ FILE __,92)利用相同的行为; PATH_SEPARATOR>“:”也为Windows返回true(所有其他操作系统上的PATH_SEPARATOR为“:”)。
3 年多之前 回复
dousi2251
dousi2251 你什么意思? Zend Server是服务器软件,而不是操作系统。 Windows 7应该返回\。
大约 6 年之前 回复
dsgd5756
dsgd5756 不幸的是,这不适用于Windows 7和Zend Server。 在这种情况下,DIRECTORY_SEPARATOR也是'\'
6 年多之前 回复
doucezhu3570
doucezhu3570 最底层的是'\\'
8 年多之前 回复



这应该适用于PHP 4.3 +:</ p>

  if(strtolower(PHP_SHLIB_SUFFIX)  ==='dll')
{
// Windows
}
else
{
// Linux / UNIX / OS X
}
</ code> </ pre>
</ DIV>

展开原文

原文

This should work in PHP 4.3+:

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

dongshen6060
dongshen6060 哇,dll已经是某种商标:)
3 年多之前 回复
dorv56831
dorv56831 这是最好的一个
4 年多之前 回复
共14条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐