2009-03-08 6 views
9

Non saprei con quale parola chiave cercare questo nel database PHP, quindi sto chiedendo qui.PHP ha una funzione per rilevare il SO su cui è in esecuzione?

Motivo che voglio sapere è a causa di come diversi sistemi operativi gestiscono nuove linee in documenti di testo.

Sto utilizzando un file CSV in Windows ma ogni volta che penso di aggiungere una nuova riga, ciò che realmente accade è che la nuova riga viene incollata sul retro dell'ultima riga.

La ragione è, in finestre, una nuova linea è questa: \r\n e il file CSVHandler.class.php sto usando solo aggiunge \n

Tuttavia, in Mac OS X che è la nuova linea, che è diverso da Windows.

Quindi sto cercando questo in modo da poter implementare una semplice dichiarazione if() e risolvere questo. Attualmente ho hardcoded il \r\n, ma dovrebbe essere più semplice, no?

+0

sì, è \ r \ n sulla vittoria, \ n su * nix e \ r su Mac (che è il più stupido realizzazione dei tre) – dusoft

+0

Ora che i Mac sono FreeBSD -based, non usano anche \ n? – Sonny

risposta

14

PHP ha incluso la costante PHP_EOL per risolvere il problema che dovete affrontare, disponibile dal PHP 4.3.10 e PHP 5.0.2 - contiene una opportuna sequenza end-of-line per il server che il PHP è in esecuzione su .

Se si desidera utilizzare una sequenza di fine riga adatta per un determinato cliente, è necessario codificarla autonomamente. Un modo per determinare il sistema operativo del client è quello di utilizzare get_browser, supponendo che il server dispone di un up-to-date browscap.ini

2

Controllare la variabile $ _SERVER.

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

È quindi possibile utilizzare strstr (o qualsiasi funzione di confronto delle stringhe) per verificare se si è su Windows. In questo esempio, ho controllato il SERVER_SIGNATURE ma puoi usare qualunque chiave tu voglia.

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

$ _SERVER ['SERVER_SIGNATURE'] era vuoto sulla mia macchina Windows (Apache 2.2 con PHP 5.3 su Windows 7 64 bit). Ho usato un'altra variabile $ _SERVER: $ isWindows = strstr ($ _ SERVER ['SERVER_SOFTWARE'], "Win32")? vero falso; – bouke

-2

Inoltre, provare questa funzione:

$b = get_browser(null, true); 

e $ b [ 'piattaforma'] sarà essere OS.

BTW, * nix OS utilizza \ n come nuova riga. Mac usées \ r, Windows - \ r \ n

+0

Stiamo cercando il server, non il browser. – stalepretzel

+0

get_browser ottiene anche il sistema operativo –

+0

, basta consultare i documenti. – Sergei

2

Si consiglia inoltre di fare un info chiamare php per dare un'occhiata a un sacco di impostazioni di configurazione della configurazione di PHP, il codice è semplice:

phpinfo(); 
0

Probabilmente la cosa più sicura da fare quando si legge è determinare il carattere finale della linea (s) dal file stesso, o accettare tutte le terminazioni di riga in modo intercambiabile. Questo ti protegge dai danni se copi il file csv da una macchina all'altra con un sistema operativo diverso. Se leggi prima di scrivere, puoi fare in modo che le terminazioni della linea di uscita corrispondano alle terminazioni di linea che hai identificato durante la lettura.

Per i file CSV, php ha alcune funzioni di libreria. Prova a cercare php.net per fgetcsv e fputcsv. C'è l'auto_detect_line_endings che può essere impostato nel php.ini, ma non conosco le specifiche di come funziona.

Io uso sempre "\ n" da solo sia su linux che su windows. Io uso il blocco note per modificarli in Windows e non rompe i finali.Per il mio uso personale di csv, trovo che sia troppo complicato supportare diversi finali, ma se si tratta di qualcosa con cui gli utenti devono interagire, allora si vuole essere sicuri piuttosto che convenienti.

34

* "BTW, nix uso OS \ n come nuova linea di Mac usées \ r, Windows -. \ R \ n"

Arrrgh! PER FAVORE, FERMA PERPETUANDO QUESTO MITO!

Mac OS 9 lo usava come 10 anni fa, ma nessuno usa più OS9. MACS USE UNIX ENDINGS DI LINEA. \ N. "Mac" usato oggi dovrebbe riferirsi ai computer contemporanei, proprio come "Windows" si riferisce a XP o Vista se non diversamente qualificato.

Dire che i Mac usano \ r è corretto come dire che "Windows gira su MS-DOS, supporta solo il filesystem FAT16 e non ha supporto 64 bit."

Nessuno dovrebbe mai usare \ r per nulla in nessuna circostanza. A meno che non stiano prendendo di mira i Mac di vecchio-culo.

+1

Grazie per aver portato questo alla nostra attenzione; tuttavia, chiamerei semplicemente informazioni obsolete su un mito. – jedmao

+0

Anche se questa non è una risposta, vale la pena segnalarla. – Alex

5

Le informazioni sul sistema operativo del server può essere ottenuto con php_uname() funzione:

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

permette anche di recuperare tutte le informazioni sulla versione.

+0

Mi ha aiutato con una domanda simile. +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

Si potrebbe utilizzare i predefiniti costanti PHP_OS.

sto usando

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

1

Un sacco di risposte aleady, ma qui è la mia 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

Suggerirei php_uname. Basta leggere la spiegazione dalla documentazione:

php_uname - Restituisce informazioni sul PHP sistema operativo è esecuzione su

Mi è piaciuto il suggerimento del PHP_OS di cui sopra, ma attenzione, per questo nota della documentazione:

considerare l'uso del PHP_OS costante, ma tenete a mente questa costante conterrà il PHP sistema operativo è stato costruito su.

2

Per quanto ne so, se PHP è in esecuzione su Windows, ci sarà una variabile d'ambiente chiamata WINDIR.Credo che si potrebbe fare questo:

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

Una brutta soluzione alternativa che dovrebbe funzionare. Ma una soluzione più elegante deve essere possibile. – darnir