2009-03-08 28 views
9

Nie wiedziałbym, pod jakim słowem kluczowym szukać tego w bazie danych PHP, więc pytam tutaj.Czy PHP ma funkcję wykrywania systemu operacyjnego, na którym działa?

Powód Chcę wiedzieć, ponieważ różne systemy operacyjne obsługują nowe linie w dokumentach tekstowych.

Używam pliku CSV w oknach, ale za każdym razem, gdy myślę, że dodaję nową linię, tak naprawdę dzieje się tak, że nowa linia zostaje wklejona na koniec ostatniej linii.

powodem jest to, w oknach, nowa linia to: \r\n a plik CSVHandler.class.php Używam tylko dodaje \n

Jednak w systemie Mac OS X, który jest nowa linia, która jest różni się od okien.

Poszukuję tego, więc mogę zaimplementować proste oświadczenie if() i rozwiązać ten problem. Obecnie mam na stałe kod \r\n, ale powinno być prostsze, nie?

+0

tak, to \ r \ n na wygraną, \ n na * nix i \ r na Mac (to najgłupsza realizacja z trzech) – dusoft

+0

Teraz, Maki są FreeBSD na bazie, czy oni też nie używają \ n? – Sonny

Odpowiedz

14

PHP włączyła stała PHP_EOL rozwiązania problemu Ci twarz, dostępne od PHP 4.3.10 i PHP 5.0.2 - zawiera odpowiednią sekwencję dla serwera, że ​​PHP jest uruchomiony na koniec-of-line .

Jeśli chcesz użyć innej sekwencji końca linii odpowiedniej dla danego klienta, musisz to samemu zakodować. Jednym ze sposobów określenia OS klienta jest użycie get_browser, zakładając, że serwer posiada up-to-date browscap.ini

2

Sprawdź zmienną $ _SERVER.

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

Następnie można użyć strstr (lub dowolnej funkcji porównywania ciągów znaków), aby sprawdzić, czy korzystasz z systemu Windows. W tym przykładzie sprawdziłem wartość parametru SERVER_SIGNATURE, ale można użyć dowolnego żądanego klucza.

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

$ _SERVER ['SERVER_SIGNATURE'] był pusty na moim komputerze z systemem Windows (Apache 2.2 z PHP 5.3 na Windows 7 64 bitów). Użyłem innej zmiennej $ _SERVER: $ isWindows = strstr ($ _ SERVER ['SERVER_SOFTWARE'], "Win32")? prawda fałsz; – bouke

-2

Spróbuj też tę funkcję:

$b = get_browser(null, true); 

iw $ b [ 'platforma'] będzie być OS.

BTW, * użycie nix OS \ n jako nowej linii. Mac usees \ r, Windows - \ r \ n

+0

Szukamy serwera, a nie przeglądarki. – stalepretzel

+0

get_browser również otrzymuje OS_ –

+0

stalepretzel, wystarczy zobaczyć dokumenty. – Sergei

2

Można też zrobić informacji php wywołanie spojrzeć na wiele ustawień konfiguracyjnych od konfiguracji PHP, kod jest prosty:

phpinfo(); 
0

Prawdopodobnie najbezpieczniejszą rzeczą do zrobienia podczas czytania jest ustalenie znaków końca linii z samego pliku lub zamiennie wszystkie zakończenia linii. Chroni to przed uszkodzeniem, jeśli skopiujesz plik CSV z jednego komputera na inny przy użyciu innego systemu operacyjnego. Jeśli przeczytasz przed napisaniem, możesz sprawić, że zakończenia linii wyjściowej będą zgodne z końcami linii zidentyfikowanymi podczas czytania.

Dla plików CSV, php ma kilka funkcji bibliotecznych. Spróbuj przeszukać php.net pod kątem fgetcsv i fputcsv. Istnieje funkcja automatycznego_detekcji_linii, którą można ustawić w pliku php.ini, ale nie znam szczegółów jej działania.

Sam zawsze używam "\ n" zarówno na linuksie, jak i na oknach. Używam notatnika, aby edytować je w oknach i nie łamie końcówek.Dla mojego własnego wykorzystania CSV uważam, że zbyt wiele problemów przy obsłudze różnych zakończeń, ale jeśli jest to coś, z czym użytkownicy muszą się komunikować, to chcesz być bezpieczny, a nie wygodny.

34

* "BTW, nix użycie OS \ n jako nowa linia Mac usees \ r, Windows -. \ R \ n"

arrrgh! PROSZĘ ZATRZYMAĆ TEN MIT!

Mac OS 9 używany tak jak 10 lat temu, ale nikt już nie używa OS9. MACS UŻYWA KOŃCÓWKI LINII UNIX. \ n. "Mac" używany dzisiaj powinien odnosić się do współczesnych komputerów, tak jak "Windows" odnosi się do XP lub vista, chyba że jest inaczej.

Mówiąc, że Mac używają \ r, można powiedzieć, że "Windows działa na systemie MS-DOS, obsługuje tylko system plików FAT16 i nie obsługuje 64-bitów."

Nikt nigdy nie powinien używać \ r do niczego w żadnych okolicznościach. Chyba że celują w macki staruszków.

+1

Dziękujemy za zwrócenie na to uwagi; chociaż nazwałbym to nieaktualną informacją mitem. – jedmao

+0

Chociaż nie jest to odpowiedź, warto ją wskazać. – Alex

5

Informacje na temat systemu operacyjnego serwera można uzyskać z php_uname() funkcji:

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

Pozwala także pobrać pełną informację na temat wersji.

+0

Pomógł mi z podobnym pytaniem. +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

Można użyć predefiniowanych stałych PHP_OS.

Używam

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

1

Wiele odpowiedzi aleady, ale tutaj jest moje 2cents:

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

Polecam php_uname. Wystarczy przeczytać wyjaśnienie od docs:

php_uname - Zwraca informacje o PHP jest system operacyjny działa na

Zrobiłem jak sugestię PHP_OS powyżej, ale należy uważać, za to Uwaga od docs:

rozważyć użycie PHP_OS stałe, ale należy pamiętać, że stała będzie zawierać PHP system operacyjny został zbudowany na.

2

O ile mi wiadomo, jeśli PHP działa w systemie Windows, pojawi się zmienna środowiskowa o nazwie WINDIR.Myślę, że można to zrobić:

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

Brzydkie obejście problemu, które powinno działać. Ale bardziej eleganckie rozwiązanie musi być możliwe. – darnir

Powiązane problemy