2009-03-08 24 views
9

No sabría bajo qué palabra clave buscar esto en la base de datos PHP, así que estoy preguntando aquí.¿PHP tiene una función para detectar el sistema operativo en el que se ejecuta?

Motivo que quiero saber es por la forma en que los diferentes sistemas operativos manejan las nuevas líneas en los documentos de texto.

Estoy usando un archivo CSV en Windows, pero cada vez que creo que agrego una nueva línea, lo que realmente sucede es que la nueva línea queda pegada en la parte posterior de la última línea.

La razón es, en las ventanas, una nueva línea es la siguiente: \r\n y el archivo CSVHandler.class.php estoy usando sólo añade \n

Sin embargo, en Mac OS X que es la nueva línea, que es diferente de las ventanas.

Así que estoy buscando esto así que puedo implementar una declaración simple if() y resolver esto. Actualmente he codificado el \r\n, pero debería ser más simple, ¿no?

+0

sí, es \ r \ n en la victoria, \ n en * nix y \ r en mac (que es la implementación más estúpida de los tres) – dusoft

+0

Ahora que los Macs son FreeBSD -basado, ¿no usan \ n también? – Sonny

Respuesta

14

PHP ha incluido la constante PHP_EOL para resolver el problema que se enfrenta, disponible a partir de PHP 4.3.10 y PHP 5.0.2 - que contiene una secuencia adecuada de fin de línea para el servidor que está corriendo PHP .

Si desea utilizar una secuencia de fin de línea diferente adecuada para un cliente en particular, tendrá que codificar usted mismo. Una forma de determinar el sistema operativo cliente es utilizar get_browser, asumiendo que su servidor tiene una puesta al día browscap.ini

2

Compruebe la variable $ _SERVER.

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

continuación, puede utilizar strstr (o cualquier función de comparación de cadenas) para comprobar si está en Windows. En este ejemplo, verifiqué el SERVER_SIGNATURE pero puede usar la clave que desee.

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

$ _SERVER ['SERVER_SIGNATURE'] estaba vacío en mi máquina Windows (Apache 2.2 ejecutando PHP 5.3 en Windows 7 64 bits). Utilicé otra variable $ _SERVER: $ isWindows = strstr ($ _ SERVER ['SERVER_SOFTWARE'], "Win32")? verdadero Falso; – bouke

-2

Además, trate de esta función:

$b = get_browser(null, true); 

y en $ b [ 'plataforma'] se ser OS.

Por cierto, * nix OS utilice \ n como nueva línea. Mac usées \ r, Windows - \ r \ n

+0

Estamos buscando el servidor, no el navegador. – stalepretzel

+0

get_browser también obtiene el OS –

+0

stalepretzel, solo vea los documentos. – Sergei

2

También puede querer hacer una llamada información php para echar un vistazo a una gran cantidad de los ajustes de configuración en la configuración de PHP, el código es simple:

phpinfo(); 
0

Probablemente lo más seguro que se puede hacer al leer es determinar el (los) carácter (es) de finalización de línea del archivo en sí, o aceptar todas las terminaciones de línea de forma intercambiable. Esto lo protege de daños si copia el archivo csv de una máquina a otra con un SO diferente. Si lee antes de escribir, puede hacer que las terminaciones de la línea de salida coincidan con los finales de línea que identificó al leer.

Para los archivos CSV, PHP tiene algunas funciones de biblioteca. Intente buscar php.net para fgetcsv y fputcsv. Existe el auto_detect_line_endings que se puede establecer en php.ini, pero no conozco los detalles de cómo funciona.

siempre uso el "\ n" por sí mismo en Linux y Windows. Uso el bloc de notas para editarlos en Windows y no rompe las terminaciones.Para mi propio uso de csv, encuentro que es demasiado complicado para soportar diferentes finales, pero si es algo con lo que los usuarios tienen que interactuar, querrás estar seguro en lugar de conveniente.

34

* "Por cierto, nix uso OS \ n como nueva línea Mac usées \ r, Windows -. \ R \ n"

ARRRGH! ¡POR FAVOR, DEJE DE PERPETUAR ESTE MITO!

Mac OS 9 lo usó hace 10 años, pero ya nadie usa OS9. MACS USE UNIX LINE ENDINGS. \norte. "Mac" que se usa hoy debería referirse a computadoras contemporáneas, al igual que "Windows" se refiere a XP o vista, a menos que esté calificado.

Decir que el uso de Mac es tan correcto como decir que "Windows se ejecuta sobre MS-DOS, solo admite el sistema de archivos FAT16 y no admite 64 bits".

Nadie debería usar alguna vez bajo ninguna circunstancia. A menos que estén apuntando a macs viejos.

+1

Gracias por traer esto a nuestra atención; sin embargo, simplemente lo llamaría información obsoleta sobre un mito. – jedmao

+0

Aunque esta no es una respuesta, vale la pena señalarlo. – Alex

5

La información sobre el sistema operativo del servidor se puede obtener con php_uname() función:

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

También permite recuperar la información completa de la versión.

+0

me ayudó con una pregunta similar. +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

Usted podría utilizar las constantes predefinidas PHP_OS.

estoy usando

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

1

Un montón de respuestas aleady, pero aquí está mi 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

Recomendaría php_uname. Basta con leer la explicación de los documentos:

php_uname - Devuelve información sobre el PHP sistema operativo se se ejecuta en

Me gustó la sugerencia de PHP_OS anteriores, pero con cuidado, por este nota de los documentos:

considerar el uso de la constante PHP_OS, pero tenga en cuenta esta constante contendrá el sistema operativo PHP se construido en.

2

Por lo que sé, si PHP se ejecuta en Windows, habrá una variable de entorno llamada WINDIR.Creo que usted puede hacer esto:

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

Una solución fea que debería funcionar. Pero una solución más elegante debe ser posible. – darnir

Cuestiones relacionadas