11

- 在 Linux 上运行 PHP 5.3.8-

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

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

测试代码,经过多次迭代,变成了一个简单的var_dump(get_browser($agent, true)). 我运行测试时直接传递用户代理字符串,以及不传递任何参数,例如var_dump(get_browser()),所有参数都具有相同的返回值。

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

浏览器.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 和 Apache 错误日志中是否提及“browscap”或任何甚至密切相关的内容 - 没有什么不寻常的。

文件结构

这就是我怀疑错误的来源。browscap.ini 位于/var/php/,具有如上所述的适当权限。我的想法是 PHP 可能无法访问这个目录,或者类似的东西。但是,此目录也是存储会话的位置,因此不太可能。

解决方案”

解决该问题的方法是将 browscap.ini 移至公共 Web 目录。我很好奇为什么会这样,特别是考虑到未记录的返回值。“解决方案”有效,但不是我想我会找到的解决方案......

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

谢谢阅读!

4

3 回答 3

7

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

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

为了使其工作,您的browscap配置设置php.ini必须指向browscap.ini系统上文件的正确位置。

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

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


解决该问题的方法是将 browscap.ini 移至公共 Web 目录。

它可能指向那个位置。即公共网络目录

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

仅需要读取权限。

于 2012-05-11T07:05:13.827 回答
4

我遇到了与原始海报完全相同的问题。解决方案?php.ini 需要 browscap.ini 文件的绝对路径。

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

browscap = browscap.ini

用那条线,getBrowser()返回false

但是,将其更改为绝对路径有效,如下所示:

browscap = /etc/browscap.ini

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

于 2012-09-06T08:51:05.820 回答
4

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

至少看看底层的源代码,让我们假设一下。

我建议你看看那里,然后让我知道你是否还有其他问题。那时我也许可以回答他们。

于 2012-05-14T13:32:53.077 回答