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

我有一个 PHP 脚本,可以放在 Windows 系统或 Linux 系统上。在这两种情况下,我都需要运行不同的命令。

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

更新

澄清一下,脚本是从命令行运行的。

86800 次浏览

核心预定义常数: 具有 PHP_OS (string)常数的 http://us3.php.net/manual/en/reserved.constants.php

或者如果你想检测客户端的操作系统:

<?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 服务器名称

你可以用

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

那么

php_uname("s")

“ s”: 操作系统名称。例如。 FreeBSD.

会为你做这个魔术,看这里 http://php.net/manual/en/function.php-uname.php

Php _ uname函数可以用来检测这一点。

echo php_uname();

您可以在 windows 上检查目录分隔符是 /(用于 unix/linux/mac)还是 \

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


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

检查 PHP_OS常数 < sup > < em > Docs 的值。

它将在 Windows 上为您提供各种值,如 WIN32WINNTWindows

参见: < em > 可能的值: PHP _ OS php_uname < sup > < em > 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!';
}
if (strncasecmp(PHP_OS, 'WIN', 3) == 0) {
echo 'This is a server using Windows!';
} else {
echo 'This is a server not using Windows!';
}

看起来似乎比接受的答案更优雅一些。

这个应该可以在 PHP 4.3 + 中使用:

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

请注意,PHP _ OS 报告 PHP 是 < em > build 的操作系统不一定是当前运行的操作系统。

如果你使用 PHP > = 5.3,只需要知道你是否在 Windows 上运行——那么测试一下 特定于 Windows 的常量是否被定义可能是一个很好的选择,例如:

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

检测是 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稍慢一些,但它对于这样一个小任务来说已经足够高效,而且更加优雅。

您可以检查 PHP > 5.3.0(手动操作)中是否存在常量

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

以前,这种方法在 Symfony 使用,现在他们使用的是 不同的方法:

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

根据 预定义常量: 用户贡献的说明 Volker 和 rdcapasso 的解决方案,您可以像下面这样简单地创建 helper 类:

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

如果你想检查是否在 Linux 下运行,只需要测试 (PHP_OS === 'Linux')。不需要使用 strtolower ()和 subr ()。

从 PHP 7.2.0开始,你可以使用常量 abc0来检测运行中的 O.S. :

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

请参阅 PHP 官方文档了解其可能的值。