Reputation: 8287
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)
To clarify, the script is running from the command line.
Upvotes: 174
Views: 93901
Reputation: 43810
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
}
Upvotes: 83
Reputation: 7073
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.
Upvotes: 35
Reputation: 1277
If you want to check if running under Linux, just test if (PHP_OS === 'Linux')
. No need to use strtolower() and substr().
Upvotes: 1
Reputation: 23216
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_uname
Docs:
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
echo 'This is a server using Windows!';
} else {
echo 'This is a server not using Windows!';
}
Upvotes: 274
Reputation: 317
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
}
Upvotes: 5
Reputation: 1119
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
}
Upvotes: 10
Reputation: 5869
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.
Upvotes: 5
Reputation: 1052
function isWin(){
if (strtolower(substr(PHP_OS, 0, 3)) === 'win' || PHP_SHLIB_SUFFIX == 'dll' || PATH_SEPARATOR == ';') {
return true;
} else {
return false;
}
}
Upvotes: -2
Reputation: 189
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');
Upvotes: 18
Reputation: 3495
This should work in PHP 4.3+:
if (strtolower(PHP_SHLIB_SUFFIX) === 'dll')
{
// Windows
}
else
{
// Linux/UNIX/OS X
}
Upvotes: 8
Reputation: 1061
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.
Upvotes: 41
Reputation: 70406
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
Upvotes: 4
Reputation: 42870
The php_uname function can be used to detect this.
echo php_uname();
Upvotes: 9