【问题标题】:get_browser() returns FALSEget_browser() 返回 FALSE
【发布时间】:2012-05-17 11:32:36
【问题描述】:

- 在 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 和 Apache 错误日志中是否有提及“browscap”或任何甚至密切相关的内容 - 没有任何异常。

文件结构

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

“解决方案”

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

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

感谢阅读!

【问题讨论】:

  • 你用这个功能做什么?用户代理标头并识别它并不完全可靠。您可能会更幸运地使用 javascript 测试浏览器的功能并将此信息发送到服务器。然而,这也不应该是必需的,因为您通常会在客户端处理 100% 的差异。
  • @dqhendricks 这是为了维护(相当大的)现有代码库。此调用的值在预处理和提供内容的所有地方都使用。我总是乐于接受新的/更好的做事方式,但要改变整个系统的当前状态可能需要太多的工作。
  • 我很好奇browsecap 的值在phi.ini 中是什么。是完整路径/var/php/browsecap.ini 还是相对路径browsecap.ini?还是您在整个测试过程中都在更改它?
  • @drew010 是完整路径,从未改变,我多次验证路径的准确性,通常通过代码:echo count(file(ini_get('browscap')));,返回预期结果。这意味着file() 可以正常打开和读取文件,所以get_browser() 应该也可以。
  • @orourkek get_browser 将返回 false 有几个原因,一个是无法打开 ini 文件、内存分配失败或读取文件错误。我怀疑由于某种原因它没有正确打开文件。见469-470行here

标签: php browscap


【解决方案1】:

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

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

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

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

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


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

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

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

仅需要读取权限。

【讨论】:

  • 使用的 browscap.ini 是可用的最新版本。我还尝试了文件系统中的多个先前版本。至于权限,PHP拥有文件和目录的读取权限,我们甚至尝试了777权限。
  • 我的意思是说 php.ini 中有 browscap 设置,它实际上是该文件的路径。检查它指向的目录。
【解决方案2】:

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

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

我建议你看看那里,如果你有其他问题,请告诉我。到时候我也许可以回答他们。

【讨论】:

  • 我已经查看了它可能返回 false 的各种原因,但考虑到环境,它们都没有任何意义。我对该错误的最佳猜测是读取/打开文件时出现问题,而我的具体问题与该理论有关,例如如果file() 可以访问该文件,为什么get_browser() 不能? PHP 用许多函数打开、读取和写入这个文件都没有问题,除了 get_browser(),它由于未知原因而失败。
【解决方案3】:

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

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

browscap = browscap.ini

使用该行,getBrowser() 返回了false

但是,将其更改为绝对路径是可行的,如下所示:

browscap = /etc/browscap.ini

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

【讨论】:

  • 有趣的是,这不是我遇到的问题的原因 - 我最初有一个相对路径,但在我的调试中改为绝对路径。虽然查看相关的source code 显示了一些返回FALSE 的地方。
猜你喜欢
  • 2013-04-26
  • 2012-06-09
  • 2012-06-18
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 2015-08-02
  • 2013-10-26
相关资源
最近更新 更多