get_browser()返回FALSE

时间:2012-05-08 23:13:08

标签: php browscap

- 在Linux上运行PHP 5.3.8 -

首先,我们已经解决了这个问题,直到函数返回预期值。然而,我仍然有很多未解决的问题,而且“解决方案”更像是一种黑客攻击。

我在这个问题上度过了一天的大部分时间,所以当我解释所做的事情时请耐心等待。首先,问题是get_browser()的返回值是FALSE,这不是记录的返回值。这使我假设返回FALSE意味着函数内存在某种错误状态。

经过多次迭代后,测试代码变得简单var_dump(get_browser($agent, true))。我运行测试时都直接传递用户代理字符串,并且不传递任何参数,例如: var_dump(get_browser()),它们都具有相同的返回值。

尝试/验证的内容,返回值没有变化:

的browscap.ini:

  • 拥有最新版本,还测试了一些以前的版本

权限:

  • bowscap.ini - 初始权限为644,但我已尝试过644-777

  • 的所有内容
  • 包含browscap.ini的目录 - 初始权限为755,尝试了777

  • 已验证PHP可以使用其他功能访问文件和目录,例如file()

用户代理

  • 尝试传递手动用户代理字符串

  • 尝试传递$ _SERVER ['HTTP_USER_AGENT']

  • 与位于遥远国度的朋友验证了我的用户代理字符串 - get_browser()按预期返回了值。

的php.ini

  • browscap设置指向正确的位置

  • 再次使用echo count(file(ini_get('browscap')));

  • 进行了验证

错误记录

  • 检查PHP&任何提及'browscap'或任何甚至密切相关的事情的Apache错误日志 - 没有什么不寻常的。

文件结构

这是我怀疑错误来自的地方。 browscap.ini位于/var/php/,其具有如上所述的适当权限。我的想法是,PHP可能无法访问此目录,或者沿着这些行。但是,此目录也是存储会话的位置,因此不太可能。

“解决方案”

解决了这个问题的原因是将browscap.ini移动到公共Web目录。我很好奇为什么会这样,特别是考虑到无证件的返回值。 “解决方案”有效,但不是我认为我会找到的解决方案......

get_browser()是否有特殊的权限要求,或类似的东西? file()可以正常访问目录和文件,但get_browser()无法(大概)。我几乎已经把头发拉出来解决这个问题,并希望得到一些解决方案!

感谢阅读!

3 个答案:

答案 0 :(得分:4)

您已尝试过所有必需的方法。

http://php.net/manual/en/function.get-browser.php注意:

  

为了实现此目的,php.ini中的browscap配置设置必须指向系统上browscap.ini文件的正确位置。

     

browscap.ini未与PHP捆绑在一起,但您可以在此处找到最新的php_browscap.ini文件。

     

虽然browscap.ini包含许多浏览器的信息,但它依赖于用户更新来保持数据库最新。该文件的格式相当不言自明。


  

解决了这个问题的原因是将browscap.ini移动到公共Web目录。

它可能指向该位置。即公共网站目录

  

get_browser()是否有特殊的权限要求,或类似的东西?

仅需要读取权限。

答案 1 :(得分:4)

实际上,即使没有在手册页上记录,get_browser函数也可能因多种原因返回FALSE

至少要看一下the underlying source code,让我们假设一下。

我建议你看看那里然后告诉我你是否还有其他问题。我或许可以回答它们。

答案 2 :(得分:3)

我和原版海报有完全相同的问题。解决方案? php.ini需要一个browscap.ini文件的绝对路径。

因此,即使PHP找到该文件并且它出现在phpinfo()的输出中,以下行也是问题所在:

browscap = browscap.ini

通过该行,getBrowser()返回了false

然而,将其改为绝对路径是有效的,如下:

browscap = /etc/browscap.ini

希望这有助于某人!这是一个奇怪的...