2012-05-08 16 views
8

- Ejecutar PHP 5.3.8 en Linux enget_browser() devuelve FALSO

Para empezar, hemos resuelto este problema hasta el punto donde la función devuelve los valores esperados. Sin embargo, todavía hay muchas preguntas sin respuesta que tengo, y la "solución" es más un hack-around que otra cosa.

He pasado la mayor parte del día sobre este tema, así que ten paciencia conmigo cuando explique lo que se hizo. Para empezar, el problema es que el valor de retorno de get_browser() es FALSE, que no es un valor de retorno documentado. Esto me lleva a suponer que FALSE devuelto significa algún tipo de estado de error dentro de la función.

El código de prueba, después de muchas iteraciones, se convirtió en un simple var_dump(get_browser($agent, true)). Ejecuté pruebas con pasar la cadena de agente de usuario directamente, así como sin pasar argumentos, p. var_dump(get_browser()), que todos tenían los mismos valores de retorno.

Lo que se trató/verificado, sin cambio en el valor de retorno:

browscap.ini:

  • tiene la última versión, también probó un par de versiones anteriores

Permisos:

  • bowscap.ini - permisos iniciales fueron 644, pero han intentado todo de 644-777

  • Directorio que contiene browscap.ini - permisos iniciales fueron 755, 777, así trataron

  • verificado que PHP puede acceder al archivo y directorio con otras funciones como file()

agente de usuario

  • Intentó pasar una cadena de agente de usuario manual de

  • Intentamos pasar $ _SERVER [ 'HTTP_USER_AGENT']

  • verificó mi cadena de agente de usuario con un amigo en una tierra lejana - get_browser() valores devueltos como se esperaba .

php.ini

  • El ajuste browscap apunta a la ubicación correcta

  • verificado de nuevo con echo count(file(ini_get('browscap')));

registros de errores

  • Chequeado PHP & Apache err o registros para cualquier mención de 'browscap' o cualquier cosa estrechamente relacionada, nada fuera de lo común.

Estructura de archivos

Aquí es donde sospecho que el error viene. browscap.ini vive en /var/php/, que tiene los permisos adecuados como se indicó anteriormente. Pensé que tal vez PHP no podía acceder a este directorio, o algo similar. Sin embargo, este directorio también es donde se almacenan las sesiones, por lo que es menos probable.

la "solución"

Lo resolvió el problema se movía browscap.ini al directorio web público. Tengo curiosidad de por qué este es el caso, especialmente dado el valor de retorno no documentado. La "solución" funciona, pero no es la solución que pensé que encontraría ...

¿Tiene get_browser() requisitos de permisos especiales, o algo por el estilo? file() podría acceder al directorio y al archivo muy bien, pero get_browser() no podría (presumiblemente). ¡Prácticamente me he largado de la cabeza por este problema y me gustaría algo de resolución!

¡Gracias por leer!

+1

¿Para qué está utilizando esta característica? El encabezado usuario-agente y reconocerlo no es exactamente confiable. Probablemente tengas más suerte probando las capacidades del navegador con javascript y enviando esta información al servidor. Sin embargo, esto tampoco debería ser necesario, ya que normalmente manejaría las varianzas al 100% del lado del cliente. – dqhendricks

+0

@dqhendricks Esto es para mantenimiento en una base de código existente (bastante grande). Los valores de esta llamada se utilizan en todo el lugar tanto en el contenido de preprocesamiento como en el de publicación. Siempre estoy abierto a nuevas/mejores formas de hacer las cosas, pero probablemente sería demasiado trabajo cambiar todo el sistema en su estado actual. – orourkek

+0

veo. bueno, buena suerte entonces. – dqhendricks

Respuesta

4

En realidad, incluso si no está documentado en la página del manual, la función get_browser puede devolver FALSE por varias razones.

Al menos un vistazo a the underlying source code supongamos que.

Le sugiero que eche un vistazo allí y luego hágamelo saber si tiene más preguntas. Podría ser capaz de responderlos entonces.

+1

He examinado las diversas razones por las que podría dar un resultado falso, pero ninguna de ellas tiene sentido, dado el entorno. Mi mejor estimación para el error es algún problema con la lectura/apertura del archivo, y mis preguntas específicas están relacionadas con esta teoría, p. si 'file()' puede acceder al archivo, ¿por qué no 'get_browser()'? PHP no tiene problemas para abrir, leer y escribir en este archivo con muchas funciones, excepto 'get_browser()', que falla por un motivo desconocido. – orourkek

4

Has probado todos los métodos necesarios.

http://php.net/manual/en/function.get-browser.php con nota:

Para que esto funcione, el ajuste de configuración browscap en php.ini debe apuntar a la ubicación correcta del archivo browscap.ini en su sistema.

browscap.ini no se incluye con PHP, pero puede encontrar un archivo php_browscap.ini actualizado aquí.

Mientras que browscap.ini contiene información sobre muchos navegadores, depende de las actualizaciones del usuario para mantener la base de datos al día. El formato del archivo es bastante autoexplicativo.

What solved the issue was moving browscap.ini to the public web directory. 

Es posible que esté apuntando a esa ubicación. es decir, directorio web público

Does get_browser() have special permissions requirements, or anything like that? 

Permisos de lectura son necesarios únicamente.

+0

El browscap.ini que se utilizó fue la última versión disponible. También probé varias versiones anteriores que teníamos en nuestro sistema de archivos. En cuanto a los permisos, PHP ** tenía ** permisos de lectura en el archivo y el directorio, e incluso llegamos a intentar 777 permisos en ambos. – orourkek

+0

Quiero decir que hay una configuración de sombreado en php.ini que en realidad es la ruta de ese archivo. Verifique a qué directorio apunta. –

3

Tuve exactamente el mismo problema que el cartel original. ¿La solución? php.ini requiere una ruta de acceso absoluta al archivo browscap.ini.

Así, a pesar de que PHP encuentra el archivo y apareció en la salida phpinfo() 's, la siguiente línea era el problema:

browscap = browscap.ini 

Con esa línea, getBrowser() regresaron false.

Sin embargo, cambiar a una ruta absoluta trabajó, así:

browscap = /etc/browscap.ini 

Espero que esto ayude a alguien! Es extraño ...

+0

Curiosamente, esta no fue la causa del problema que estaba experimentando: originalmente tenía una ruta relativa, pero cambié a absoluta en mi depuración. Aunque al mirar el [código fuente] relevante (http://lxr.php.net/xref/PHP_5_3/ext/standard/browscap.c#454) se muestran algunos lugares donde 'FALSE' se devuelve. – orourkek

Cuestiones relacionadas