PHP 脚本 - 检测是不是在 linux 或 Windows 下运行?
Posted
技术标签:
【中文标题】PHP 脚本 - 检测是不是在 linux 或 Windows 下运行?【英文标题】:PHP script - detect whether running under linux or Windows?PHP 脚本 - 检测是否在 linux 或 Windows 下运行? 【发布时间】:2011-08-18 06:05:27 【问题描述】:我有一个 php 脚本,可以放在 windows 系统或 linux 系统上。无论哪种情况,我都需要运行不同的命令。
如何检测我所处的环境? (最好是 PHP 而不是聪明的系统黑客)
更新
为了澄清,脚本是从命令行运行的。
【问题讨论】:
执行基准测试后,\strncasecmp(\PHP_OS, 'WIN', 3) === 0
、\strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN'
和 \stripos(\PHP_OS, 'WIN')
之间的性能差异似乎低于 15%。由于所有三种解决方案只需要大约 100 纳秒,无论如何这将是一个微优化。所以选择你喜欢的任何解决方案。最后,你可能会争辩说\strncasecmp(\PHP_OS, 'WIN', 3) === 0
是最易读的。
【参考方案1】:
检查PHP_OS
constantDocs的值。
它将在 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!';
【讨论】:
如果是 Windows 会有什么价值?我看不到文档中的任何内容。 破旧衣服:见***.com/questions/738823/possible-values-for-php-osstripos(PHP_OS, 'WIN') === 0
可以改为使用,可以说更易读/更简单。
@dw1 - 它仍然可以在开始搜索“win”时工作。
有了 php8 我们现在有了if (str_starts_with(strtoupper(PHP_OS), 'WIN'))
【参考方案2】:
您可以检查目录分隔符是/
(适用于unix/linux/mac)还是Windows 上的\
。常量名是DIRECTORY_SEPARATOR
。
if (DIRECTORY_SEPARATOR === '/')
// unix, linux, mac
if (DIRECTORY_SEPARATOR === '\\')
// windows
【讨论】:
很遗憾,这不适用于 Windows 7 和 Zend Server。在这种情况下 DIRECTORY_SEPARATOR 也是 '\' @Achim 你是什么意思? Zend Server 是服务器软件,而不是操作系统。 Windows 7 应该返回 \.strpos(__FILE__,92)
利用了相同的行为; PATH_SEPARATOR>":"
对于 Windows 也返回 true(PATH_SEPARATOR 在所有其他操作系统上为“:”)。
把它变成了一个函数:function is_linux()return (DIRECTORY_SEPARATOR == '/') ? true : false;
【参考方案3】:
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 的检测是最快的。
【讨论】:
抱歉,如果您使用的是 Mac 服务器,这将无法正常工作,因为在 Mac 中您会得到一个包含“DARWIN”的字符串,该字符串也包含“WIN”,所以在 Mac 中服务器你会得到“这是一个使用 Windows 的服务器!”这不是真的。 嗯,这并不完全正确。请注意,strncasecmp
采用 前 n 个字符,而不仅仅是任何 n 个字符。如果您尝试过,您会发现 strncasecmp('DARWIN', 'WIN', 3) == 0
的计算结果为 false
。【参考方案4】:
从 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 了解它的可能值。
【讨论】:
@Stef 根据 3v4l,它仅适用于 PHP 7.2 3v4l.org/CBpG4【参考方案5】:请注意PHP_OS reports the OS that PHP was built on,它不一定与当前运行的操作系统相同。
如果您使用的是 PHP >= 5.3,并且只需要知道您是否在 Windows 上运行,那么测试是否定义了 Windows-specific constants 之一可能是一个不错的选择,例如:
$windows = defined('PHP_WINDOWS_VERSION_MAJOR');
【讨论】:
1.正确的不是构建 PHP 的地方,而是构建 FOR 2 的地方。这同样适用于定义的窗口相关常量... 反正为 Windows 构建的 PHP 不能在 unix 上运行,可以吗?【参考方案6】:php_uname 函数可用于检测这一点。
echo php_uname();
【讨论】:
【参考方案7】:根据Predefined Constants: User Contributed Notes Volker 和 rdcapasso 的解决方案,您可以像这样简单地创建帮助类:
<?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
【讨论】:
【参考方案8】:这应该在 PHP 4.3+ 中工作:
if (strtolower(PHP_SHLIB_SUFFIX) === 'dll')
// Windows
else
// Linux/UNIX/OS X
【讨论】:
【参考方案9】:检测是 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
慢一点,但对于这么小的任务来说它足够高效,而且更优雅。
【讨论】:
虽然代码很简单,但这个答案并不独立:一个好的答案不会强迫人们在来自搜索引擎时阅读问题,因为它是独立的。 【参考方案10】:核心预定义常量: 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
根据您的编辑,您可以参考这个重复的PHP Server Name from Command Line
你可以使用
string php_uname ([ string $mode = "a" ] )
所以
php_uname("s")
's':操作系统名称。例如。 FreeBSD。
会为您解决问题,请参阅此处http://php.net/manual/en/function.php-uname.php
【讨论】:
【参考方案11】:您可以检查 PHP >5.3.0 (manual) 中是否存在常量
if (defined('PHP_WINDOWS_VERSION_BUILD'))
// is Windows
以前,这种方法用于 Symfony。现在他们使用different method:
if ('\\' === DIRECTORY_SEPARATOR)
// is Windows
【讨论】:
【参考方案12】:如果要检查是否在Linux下运行,只需测试(PHP_OS === 'Linux')
。无需使用 strtolower() 和 substr()。
【讨论】:
【参考方案13】:function isWin()
if (strtolower(substr(PHP_OS, 0, 3)) === 'win' || PHP_SHLIB_SUFFIX == 'dll' || PATH_SEPARATOR == ';')
return true;
else
return false;
【讨论】:
以上是关于PHP 脚本 - 检测是不是在 linux 或 Windows 下运行?的主要内容,如果未能解决你的问题,请参考以下文章
Linux如何使用shell命令检测PHP木马防止脚本木马的破坏
Linux Shell 脚本:如何检测 NFS 挂载点(或服务器)已死?
求linux脚本,就是服务器自动检测网络,每个一段时间自动检测,丢包严重或断网,就自动重启服务器,求高手