174

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.

1
  • 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. Commented Aug 19, 2019 at 23:26

13 Answers 13

275

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!';
}
Sign up to request clarification or add additional context in comments.

9 Comments

What value would it be if it's Windows? There is nothing in the docs that I can see.
stripos(PHP_OS, 'WIN') === 0 can be used instead, arguably more readable / simple.
@dw1 - it would still work as it searches for "win" at the beginning.
And with php8 we now have if (str_starts_with(strtoupper(PHP_OS), 'WIN')) {
|
84

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
}

4 Comments

Unfortunately this does not work with Windows 7 and Zend Server. In this case DIRECTORY_SEPARATOR is also '\'
@Achim What do you mean? Zend Server is server software, not an OS. Windows 7 should return \.
strpos(__FILE__,92) exploits the same behaviour; PATH_SEPARATOR>":" returns true for Windows too (PATH_SEPARATOR is ":" on all other OSs).
Turned this into a function: function is_linux(){return (DIRECTORY_SEPARATOR == '/') ? true : false;}
41
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.

2 Comments

Sorry, but this doesn't work right if you're using a Mac server, since in Mac you get a string that contains "DARWIN", which also contains "WIN", so in a Mac server you'll get "This is a server using Windows!" which is not true.
Well, this is not quite true. Notice that strncasecmp takes the first n characters, not just any n characters. If you tried it, you would have found out that strncasecmp('DARWIN', 'WIN', 3) == 0 evaluates to false.
36

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.

2 Comments

@Stef According to 3v4l, it's only available in PHP 7.2 3v4l.org/CBpG4
Being that almost everybody should really being using PHP version 7.2+, this is most elegant answer
18

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

2 Comments

1. Correct is not where PHP was built ON but for what it was built FOR 2. This applies to the defined windows related constant the same way...
Anyway PHP built for Windows can not be run on unix, can it?
10

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
}

Comments

9

The php_uname function can be used to detect this.

echo php_uname();

Comments

8

This should work in PHP 4.3+:

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

Comments

5

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.

1 Comment

Although the code is simple enough, this answer does not stand on its own: A great answer doesn't force one to read the question when coming from a search engine, because it is self-contained.
5

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
}

Comments

4

Core Predefined Constants: https://www.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 https://www.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

Comments

1

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

Comments

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.