我有一个可以放在Windows系统或Linux系统上的PHP脚本。在任何一种情况下我都需要运行不同的命令。
如何检测我所在的环境? (最好是PHP而不是聪明的系统黑客)
为了澄清,脚本是从命令行运行的。
答案 0 :(得分:208)
它会在Windows上为您提供各种值,例如WIN32
,WINNT
或Windows
。
请参阅:Possible Values For: PHP_OS和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!';
}
答案 1 :(得分:54)
您可以在Windows上检查目录分隔符是/
(对于unix / linux / mac)还是\
。常量名称为DIRECTORY_SEPARATOR
if (DIRECTORY_SEPARATOR == '/') {
// unix, linux, mac
}
if (DIRECTORY_SEPARATOR == '\\') {
// windows
}
答案 2 :(得分:36)
if (strncasecmp(PHP_OS, 'WIN', 3) == 0) {
echo 'This is a server using Windows!';
} else {
echo 'This is a server not using Windows!';
}
似乎比接受的答案更优雅。但是,使用DIRECTORY_SEPARATOR进行的上述检测是最快的。
答案 3 :(得分:16)
请注意PHP_OS reports the OS that PHP was built on,它不一定与当前运行的操作系统相同。
如果您使用的是PHP&gt; = 5.3并且只需知道您是在Windows上运行还是不在Windows上运行,那么测试是否定义了Windows-specific constants之一可能是一个不错的选择,例如:< / p>
$windows = defined('PHP_WINDOWS_VERSION_MAJOR');
答案 4 :(得分:8)
php_uname功能可用于检测此情况。
echo php_uname();
答案 5 :(得分:6)
这应该适用于PHP 4.3 +:
if (strtolower(PHP_SHLIB_SUFFIX) === 'dll')
{
// Windows
}
else
{
// Linux/UNIX/OS X
}
答案 6 :(得分:4)
核心预定义常量: http://us3.php.net/manual/en/reserved.constants.php具有PHP_OS (string)
常量。
或者如果您想检测客户端的操作系统:
<?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
根据您的编辑,您可以参考此dublicate PHP Server Name from Command Line
您可以使用
string php_uname ([ string $mode = "a" ] )
所以
php_uname("s")
's':操作系统名称。例如。 FreeBSD的。
答案 7 :(得分:4)
根据Predefined Constants: User Contributed Notes Volker&rdcapasso解决方案,你可以简单地创建这样的辅助类:
$cnt = 0
Get-Content 'C:\path\to\input.csv' |
Where-Object { ($cnt++) -ne 4 } |
Set-Content 'C:\path\to\output.csv'
<强>用法:强>
<?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;
}
}
}
答案 8 :(得分:3)
检测它是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
}
在这种特殊情况下, stripos
比substr
慢一点,但它对于这么小的任务来说足够有效,而且更加优雅。
答案 9 :(得分:1)
您可以检查PHP&gt; 5.3.0(manual)
中是否存在常量if (defined('PHP_WINDOWS_VERSION_BUILD')) {
// is Windows
}
以前,这种方法用于Symfony。现在他们使用different method:
if ('\\' === DIRECTORY_SEPARATOR) {
// is Windows
}
答案 10 :(得分:1)
从PHP 7.2.0开始,您可以检测正在运行的操作系统。使用常量PHP_OS_FAMILY
:
if (PHP_OS_FAMILY === "Windows") {
echo "Running on Windows";
} elseif (PHP_OS_FAMILY === "Linux") {
echo "Running on Linux";
}
有关可能的值,请参见official PHP documentation。
答案 11 :(得分:0)
If you want to check if running under Linux, just test if (PHP_OS === 'Linux')
. No need to use strtolower() and substr().
答案 12 :(得分:-1)
function isWin(){
if (strtolower(substr(PHP_OS, 0, 3)) === 'win' || PHP_SHLIB_SUFFIX == 'dll' || PATH_SEPARATOR == ';') {
return true;
} else {
return false;
}
}
答案 13 :(得分:-2)
来自http://www.php.net/manual/en/reserved.variables.server.php#102162:
<?php
echo '<table border="1">';
foreach ($_SERVER as $k => $v){
echo "<tr><td>" . $k ."</td><td>" . $v . "</td></tr>";
}
echo "</table>"
?>
这是整个$ _SERVER数组......正如ArtWorkAD所指出的那样,通过使用HTTP_USER_AGENT键,您可以更明确地提取操作系统。