我有一个 PHP 脚本,可以放在 Windows 系统或 Linux 系统上。在这两种情况下,我都需要运行不同的命令。
我如何检测我所处的环境? (最好是 PHP 而不是聪明的系统黑客)
澄清一下,脚本是从命令行运行的。
核心预定义常数: 具有 PHP_OS (string)常数的 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 服务器名称
你可以用
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 的值。
PHP_OS
它将在 Windows 上为您提供各种值,如 WIN32、 WINNT或 Windows。
WIN32
WINNT
Windows
参见: < em > 可能的值: PHP _ OS 和 php_uname < sup > < em > Docs :
php_uname
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 }
在这种特殊情况下,stripos比 substr稍慢一些,但它对于这样一个小任务来说已经足够高效,而且更加优雅。
stripos
substr
您可以检查 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_OS === 'Linux')
从 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 官方文档了解其可能的值。