150
votes

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.

13
After performing benchmarks, it seems that any differences in performance between \strncasecmp(\PHP_OS, 'WIN', 3) === 0, \strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN' and \stripos(\PHP_OS, 'WIN') are below 15%. Since all three solutions only take roughly 100 nanoseconds, this would be a micro-optimization, anyway. So choose whatever solution you like. Finally, you may argue that \strncasecmp(\PHP_OS, 'WIN', 3) === 0 is the most readable. - caw

13 Answers

245
votes

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!';
}
67
votes

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

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

if (DIRECTORY_SEPARATOR === '\\') {
    // windows
}
39
votes
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.

17
votes

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');
14
votes

Starting with PHP 7.2.0 you can detect the running O.S. using the constant PHP_OS_FAMILY:

if (PHP_OS_FAMILY === "Windows") {
  echo "Running on Windows";
} elseif (PHP_OS_FAMILY === "Linux") {
  echo "Running on Linux";
}

See the official PHP documentation for its possible values.

8
votes

The php_uname function can be used to detect this.

echo php_uname();
8
votes

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

This should work in PHP 4.3+:

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

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'] . "\n\n";

    $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

4
votes

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.

2
votes

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
}
0
votes

If you want to check if running under Linux, just test if (PHP_OS === 'Linux'). No need to use strtolower() and substr().

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