我有一个 PHP 脚本,它可能被放置在 Windows 系统或 Linux 系统上。我需要在任一情况下运行不同的命令。
如何检测我所处的环境?(最好是使用 PHP 而不是 clever system hacks)
更新
澄清一下,该脚本是从命令行运行的。
我有一个 PHP 脚本,它可能被放置在 Windows 系统或 Linux 系统上。我需要在任一情况下运行不同的命令。
如何检测我所处的环境?(最好是使用 PHP 而不是 clever system hacks)
澄清一下,该脚本是从命令行运行的。
检查PHP_OS
常量文档的值。
在Windows上,它会给你不同的值,例如WIN32
、WINNT
或Windows
。
也可以参考:可能的值:PHP_OS和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!';
}
stripos(PHP_OS, 'WIN') === 0
来代替,它可能更易读/简单。 - John Huntif (str_starts_with(strtoupper(PHP_OS), 'WIN')) {
。 - Redzarf您可以检查目录分隔符是/
(适用于Unix / Linux / macOS)还是\
(适用于Windows)。常量名称为DIRECTORY_SEPARATOR
。
if (DIRECTORY_SEPARATOR === '/') {
// unix, linux, mac
}
if (DIRECTORY_SEPARATOR === '\\') {
// windows
}
strpos(__FILE__,92)
利用了相同的行为; PATH_SEPARATOR>":"
在 Windows 上也返回 true(在所有其他操作系统上,PATH_SEPARATOR 都是“:”)。 - Titusfunction is_linux(){return (DIRECTORY_SEPARATOR == '/') ? true : false;}
- Mario Lurigif (strncasecmp(PHP_OS, 'WIN', 3) == 0) {
echo 'This is a server using Windows!';
} else {
echo 'This is a server not using Windows!';
}
看起来比被接受的答案更加优雅。不过前面提到使用 DIRECTORY_SEPARATOR 进行检测是最快的。
strncasecmp
只取前 n 个字符,而不是任意 n 个字符。如果尝试过的话,你会发现 strncasecmp('DARWIN', 'WIN', 3) == 0
的结果是 false
。 - Ondřej BoudaPHP_OS_FAMILY
检测正在运行的操作系统。if (PHP_OS_FAMILY === "Windows") {
echo "Running on Windows";
} elseif (PHP_OS_FAMILY === "Linux") {
echo "Running on Linux";
}
请参考官方PHP文档以获得其可能的值。
请注意,PHP_OS报告的是PHP编译时所使用的操作系统,并不一定是当前正在运行的操作系统。
如果你使用的是 PHP >= 5.3,并且只需要知道自己是否正在运行在 Windows 或非 Windows 系统上,那么测试一个Windows专用常量是否已定义也许是个好选择,例如:
$windows = defined('PHP_WINDOWS_VERSION_MAJOR');
<?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
}
这应该适用于PHP 4.3+:
if (strtolower(PHP_SHLIB_SUFFIX) === 'dll')
{
// Windows
}
else
{
// Linux/UNIX/OS X
}
检测操作系统是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
略慢,但对于如此小的任务来说足够高效,而且更加优雅。
\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
是最易读的。 - caw