2009-03-08 26 views
9

Tôi sẽ không biết theo từ khóa nào để tìm kiếm điều này trong cơ sở dữ liệu PHP, vì vậy tôi hỏi ở đây.PHP có chức năng phát hiện hệ điều hành đang chạy không?

Lý do tôi muốn biết là do các Hệ điều hành khác nhau xử lý các dòng mới trong các tài liệu văn bản như thế nào.

Tôi đang sử dụng tệp CSV trong cửa sổ nhưng mỗi lần tôi nghĩ rằng tôi thêm một dòng mới, điều thực sự xảy ra là dòng mới được dán vào mặt sau của dòng mới nhất.

Lý do là, trong các cửa sổ, một dòng mới là thế này: \r\n Và file CSVHandler.class.php Tôi đang sử dụng chỉ cho biết thêm \n

Tuy nhiên, trong MAC OS X đó là dòng sản phẩm mới, đó là khác với cửa sổ.

Vì vậy, tôi đang tìm kiếm điều này để tôi có thể thực hiện một tuyên bố đơn giản if() và giải quyết vấn đề này. Hiện tại tôi đã hardcoded các \r\n, nhưng nó phải được đơn giản, không?

+0

yeah, đó là \ r \ n trên chiến thắng, \ n trên * nix và \ r trên mac (đó là việc thực hiện ngu ngốc nhất từ ​​ba) – dusoft

+0

Bây giờ Mac là FreeBSD dựa trên, họ không sử dụng \ n là tốt? – Sonny

Trả lời

14

PHP đã bao gồm hằng PHP_EOL để giải quyết vấn đề bạn phải đối mặt, sẵn từ php 4.3.10 và PHP 5.0.2 - nó có chứa một end-of-line chuỗi thích hợp cho máy chủ mà PHP đang chạy trên .

Nếu bạn muốn sử dụng trình tự cuối dòng khác phù hợp với một khách hàng cụ thể, thì bạn sẽ phải tự viết mã đó. Một cách để xác định hệ điều hành khách hàng là sử dụng get_browser, giả sử máy chủ của bạn có một up-to-date browscap.ini

2

Kiểm tra biến $ _SERVER.

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

Sau đó, bạn có thể sử dụng strstr (hoặc bất kỳ chức năng so sánh chuỗi nào) để kiểm tra xem bạn có đang sử dụng Windows hay không. Trong ví dụ này, tôi đã kiểm tra SERVER_SIGNATURE nhưng bạn có thể sử dụng bất kỳ khóa nào bạn muốn.

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

$ _SERVER ['SERVER_SIGNATURE'] trống trên máy tính Windows của tôi (Apache 2.2 chạy PHP 5.3 trên Windows 7 64 bit). Tôi đã sử dụng biến $ _SERVER khác: $ isWindows = strstr ($ _ SERVER ['SERVER_SOFTWARE'], "Win32")? đúng sai; – bouke

-2

Ngoài ra, hãy thử chức năng này:

$b = get_browser(null, true); 

và $ b [ 'nền tảng'] sẽ là hệ điều hành.

BTW, * nix OS sử dụng \ n làm dòng mới. Mac usees \ r, Windows - \ r \ n

+0

Chúng tôi đang tìm kiếm máy chủ chứ không phải trình duyệt. – stalepretzel

+0

get_browser cũng nhận được hệ điều hành –

+0

stalepretzel, chỉ cần xem tài liệu. – Sergei

2

Bạn cũng có thể muốn làm một cuộc gọi thông tin php để có một cái nhìn vào rất nhiều các thiết lập cấu hình trên thiết lập PHP của bạn, mã rất đơn giản:

phpinfo(); 
0

Có lẽ điều an toàn nhất cần làm khi đọc là xác định dòng kết thúc (các) ký tự từ chính tệp đó hoặc chấp nhận tất cả các kết thúc dòng thay thế cho nhau. Điều này bảo vệ bạn khỏi bị tổn hại nếu bạn sao chép tệp csv từ máy này sang máy khác với một hệ điều hành khác. Nếu bạn đọc trước khi viết, bạn có thể làm cho kết thúc dòng đầu ra của bạn khớp với dòng kết thúc mà bạn đã xác định khi đọc.

Đối với tệp CSV, php có một số chức năng thư viện. Hãy thử tìm kiếm php.net cho fgetcsv và fputcsv. Có auto_detect_line_endings có thể được đặt trong php.ini, nhưng tôi không biết chi tiết về cách nó hoạt động.

Tôi luôn tự sử dụng "\ n" trên cả linux và windows. Tôi sử dụng notepad để chỉnh sửa chúng trong cửa sổ và nó không phá vỡ các kết thúc.Để sử dụng riêng của tôi về csv tôi thấy rằng nó quá nhiều rắc rối để hỗ trợ kết thúc khác nhau, nhưng nếu nó là một cái gì đó người dùng phải tương tác với sau đó bạn muốn được an toàn hơn là thuận tiện.

34

* "BTW, nix sử dụng hệ điều hành \ n như dòng mới Mac usees \ r, Windows -. \ R \ n"

arrrgh! XIN VUI LÒNG TỪ NGAY LẬP TỨC NÀY!

Mac OS 9 sử dụng cách đây 10 năm, nhưng không ai sử dụng OS9 nữa. MACS SỬ DỤNG UNIX LINE ENDINGS. \ n. "Mac" được sử dụng ngày nay nên đề cập đến các máy tính hiện đại, giống như "Windows" dùng để chỉ XP hoặc vista trừ khi có đủ điều kiện.

Việc sử dụng máy Mac nói đúng là nói rằng "Windows chạy trên MS-DOS, chỉ hỗ trợ hệ thống tệp FAT16 và không hỗ trợ 64 bit".

Không ai có thể sử dụng \ r cho bất kỳ điều gì trong bất kỳ trường hợp nào. Trừ khi họ đang nhắm mục tiêu các máy Mac cũ.

+1

Cảm ơn bạn đã lưu ý chúng tôi; mặc dù, tôi chỉ đơn giản gọi nó là thông tin lỗi thời về một huyền thoại. – jedmao

+0

Mặc dù đây không phải là câu trả lời, nhưng nó đáng để chỉ ra. – Alex

5

Những thông tin về hệ điều hành máy chủ có thể thu được với php_uname() chức năng:

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

Nó cũng cho phép để lấy thông tin đầy đủ về phiên bản.

+0

Giúp tôi với một câu hỏi tương tự. +1 – MitMaro

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; 
?> 
0
$svr_os=strtolower(reset(explode(' ',php_uname('s')))); 

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

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

Bạn có thể sử dụng được xác định trước liên tục PHP_OS.

Tôi đang sử dụng

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

1

Rất nhiều câu trả lời aleady, nhưng đây là 2cents tôi:

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")); 
} 
1

Tôi muốn giới thiệu php_uname. Chỉ cần đọc những lời giải thích từ các tài liệu:

php_uname - Trả thông tin về PHP hệ điều hành được chạy trên

tôi đã làm như gợi ý của PHP_OS trên, nhưng hãy cẩn thận, mỗi này lưu ý từ tài liệu:

xem xét sử dụng hằng số PHP_OS, nhưng lưu ý hằng số này sẽ chứa hệ điều hành PHP là được xây dựng trên.

2

Theo như tôi biết, nếu PHP đang chạy trên Windows, sẽ có một biến môi trường có tên là WINDIR.Tôi nghĩ rằng bạn có thể làm điều này:

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

Một cách giải quyết xấu sẽ hoạt động. Nhưng một giải pháp thanh lịch hơn là có thể. – darnir

Các vấn đề liên quan