PHP是否具有检测正在运行的操作系统的功能?

时间:2009-03-08 16:05:10

标签: php operating-system newline

我不知道在PHP数据库中查找哪个关键字,所以我在这里问。

我想知道的原因是因为操作系统在文本文档中处理新行的方式不同。

我在Windows中使用CSV文件,但每当我想添加一个新行时,真正发生的是新行被粘贴到最新行的后面。

原因是,在Windows中,新行是这样的:\r\n 我正在使用的CSVHandler.class.php文件只添加了\n

但是,在MAC OS X中,这是新行,与windows不同。

所以我正在寻找这个,所以我可以实现一个简单的if()语句并解决这个问题。目前我已经对\r\n进行了硬编码,但它应该更简单,不是吗?

13 个答案:

答案 0 :(得分:35)

  

*“BTW, nix OS使用\ n作为新行.Mac   usees \ r,Windows - \ r \ n“

ARRRGH!请停止阅读这个神话!

Mac OS 9就像10年前一样,但没有人再使用OS9了。 MACS使用UNIX行结束。 \ n。今天使用的“Mac”应该指代当代计算机,就像“Windows”指的是XP或vista,除非另有限定。

说Macs使用\ r是正确的说法“Windows运行在MS-DOS之上,只支持FAT16文件系统,并且没有64位支持。”

在任何情况下,任何人都不应该使用\ r进行任何操作。除非他们针对的是老式捣蛋鬼。

答案 1 :(得分:14)

PHP已经包含常量PHP_EOL来解决你遇到的问题,从php 4.3.10和PHP 5.0.2开始 - 它包含一个适合运行PHP的服务器的行结束序列

如果您想使用适合特定客户端的不同行尾序列,那么您必须自己编写代码。确定客户端操作系统的一种方法是使用get_browser,假设您的服务器具有最新browscap.ini

答案 2 :(得分:12)

您可以使用预定义常量 PHP_OS

我正在使用

  

if(PHP_OS ==='WINNT'){...}

答案 3 :(得分:5)

可以使用php_uname()功能获取有关服务器操作系统的信息:

echo 'I have been run on '.php_uname('s');

它还允许检索版本的完整信息。

答案 4 :(得分:2)

检查$ _SERVER变量。

echo "<pre>";
print_r($_SERVER);

然后,您可以使用strstr(或任何字符串比较功能)来检查您是否在Windows上。在这个例子中,我检查了SERVER_SIGNATURE,但你可以使用你想要的任何键。

$isWindows = strstr($_SERVER[SERVER_SIGNATURE], "Win32") !== FALSE;

答案 5 :(得分:2)

你可能还想做一个php信息调用来查看PHP设置中的很多配置设置,代码很简单:

phpinfo();

答案 6 :(得分:2)

据我所知,如果PHP在Windows上运行,则会有一个名为WINDIR的环境变量。我认为你可以做到这一点:

$isWindows = isset($_SERVER['WINDIR']);

答案 7 :(得分:1)

已经有很多答案,但这是我的2美分:

function windows_server()
#   Purpose:    Check if server is Windows
{
    return in_array(strtolower(PHP_OS), array("win32", "windows", "winnt"));
}

## --------------------------------------------------------

function linux_server()
#   Purpose:    Check if server is Linux
{
    return in_array(strtolower(PHP_OS), array("linux", "superior operating system"));
}

答案 8 :(得分:1)

我建议php_uname。只需阅读文档中的解释:

  

php_uname - 返回有关PHP操作系统的信息   在

上运行

我确实喜欢上面 PHP_OS 的建议,但请注意,请参阅文档中的这条说明:

  

考虑使用PHP_OS常量,但要记住这个常量   将包含操作系统PHP 内置 on。

答案 9 :(得分:0)

读取时最安全的做法是从文件本身确定行结束字符,或者可以互换地接受所有行结尾。如果将csv文件从一台计算机复制到另一台具有不同操作系统的计算机,则可以保护您免受伤害。如果您在写作之前阅读,则可以使输出行结尾与您在阅读时识别的行结尾相匹配。

对于CSV文件,php有一些库函数。尝试在php.net上搜索fgetcsv和fputcsv。有一个auto_detect_line_endings可以在php.ini中设置,但我不知道它是如何工作的具体细节。

我总是在linux和windows上单独使用“\ n”。我使用记事本在Windows中编辑它们并没有打破结局。对于我自己使用的csv,我发现支持不同的结局太麻烦了,但是如果用户必须与之交互,那么你想要安全而不是方便。

答案 10 :(得分:0)

<?php
$OSList = array
(
        // Match user agent string with operating systems
        'Windows 3.11' => 'Win16',
        'Windows 95' => '(Windows 95)|(Win95)|(Windows_95)',
        'Windows 98' => '(Windows 98)|(Win98)',
        'Windows 2000' => '(Windows NT 5.0)|(Windows 2000)',
        'Windows XP' => '(Windows NT 5.1)|(Windows XP)',
        'Windows Server 2003' => '(Windows NT 5.2)',
        'Windows Vista' => '(Windows NT 6.0)',
        'Windows 7' => '(Windows NT 7.0)',
        'Windows NT 4.0' => '(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)',
        'Windows ME' => 'Windows ME',
        'Open BSD' => 'OpenBSD',
        'Sun OS' => 'SunOS',
        'Linux' => '(Linux)|(X11)',
        'Mac OS' => '(Mac_PowerPC)|(Macintosh)',
        'QNX' => 'QNX',
        'BeOS' => 'BeOS',
        'OS/2' => 'OS/2',
        'Search Bot'=>'(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(MSNBot)|(Ask Jeeves/Teoma)|(ia_archiver)'
);

// Loop through the array of user agents and matching operating systems
foreach($OSList as $CurrOS=>$Match)
{
        // Find a match
        if (eregi($Match, $_SERVER['HTTP_USER_AGENT']))
        {
                // We found the correct match
                break;
        }
}
// You are using Windows Vista
echo "You are using ".$CurrOS;
?>

答案 11 :(得分:0)

$svr_os=strtolower(reset(explode(' ',php_uname('s'))));

$isLinux=$svr_os==='linux';

$isWindows=$svr_os==='windows';

答案 12 :(得分:-2)

另外,试试这个功能:

$b = get_browser(null, true);

并且$ b ['platform']将是OS。

BTW,* nix OS使用\ n作为新行。 Mac使用\ r,Windows - \ r \ n