2012-05-08 71 views
8

- 基于Linuxget_browser()返回FALSE

运行PHP 5.3.8开始,我们已经解决了这个问题,其中函数返回的预期值的点。然而,我仍然有很多未解决的问题,而“解决方案”更像是一种黑客攻击。

我已经在这个问题上花了一天的更多时间,所以请耐心等待,因为我解释了所做的事情。首先,问题是get_browser()的返回值为FALSE,这不是记录的返回值。这导致我认为FALSE被返回意味着函数中的某种错误状态。

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

什么受审/验证,在返回值没有变化:

的browscap.ini:

  • 拥有最新版本,还测试了几个以前的版本

Permissions:

  • bowscap.ini - 初始权限是644,但我已经试过各种含有的browscap.ini 644-777

  • 目录 - 初始权限为755,试了777以及

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

用户代理

  • 试图通过手动用户代理字符串

  • 试图通过$ _ SERVER [“HTTP_USER_AGENT”]

  • 验证,在一个遥远的朋友我的用户代理字符串 - get_browser()返回值如预期。

php。INI

  • 的browscap设置指向正确的位置

  • echo count(file(ini_get('browscap')));

错误日志

  • 经过PHP &阿帕奇再次验证ERR或记录任何提及'browscap'或任何与之密切相关的东西 - 没有什么不寻常的。

文件结构

这是我怀疑是错误的来源。 browscap.ini生活在/var/php/,如上所述,它具有适当的权限。我的想法是,也许PHP无法访问此目录,或沿着这些线路。但是,这个目录也是存储会话的地方,所以变得不太可能。

“解决方案”

什么解决的问题是移动的browscap.ini到公共网页目录。我很好奇为什么会出现这种情况,尤其是考虑到无证的退货价值。 “解决方案”的作品,但不是我想我会找到的解决方案...

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

感谢您的阅读!

+1

你用什么功能?用户代理标题并识别它并不完全可靠。你可能会有更好的运气用javascript测试浏览器的功能并将这些信息发送到服务器。然而,这也不应该是必需的,因为您通常会处理差异100%的客户端。 – dqhendricks

+0

@dqhendricks这是为了维护一个(相当大的)现有的代码库。来自此调用的值在预处理和服务内容中均可使用。我总是乐于接受新的/更好的做事方式,但改变目前状态下的整个系统可能工作太多。 – orourkek

+0

我明白了。那么祝你好运。 – dqhendricks

回答

4

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

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

我建议你看看那里,然后让我知道你是否还有其他问题。那么我可能能够回答他们。

+1

我已经看到了它可能返回错误的各种原因,但考虑到环境,它们都没有任何意义。对错误的最佳猜测是读取/打开文件时出现的一些问题,我的具体问题与这个理论有关,例如,如果'file()'可以访问文件,为什么不能'get_browser()'?除了'get_browser()',由于未知的原因,PHP没有任何问题打开,读取和写入这个包含许多函数的文件。 – orourkek

4

你已经尝试了所有需要的方法。

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

为了这个工作,在php.ini您browscap配置必须指向你的系统上的browscap.ini文件的正确位置。

browscap.ini没有与PHP捆绑在一起,但您可以在这里找到最新的»php_browscap.ini文件。

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

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

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

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

只需要读取权限。

+0

使用的browscap.ini是可用的最新版本。我也尝试了我们在文件系统中的多个以前的版本。至于权限,PHP **对文件和目录拥有**读取权限,甚至我们甚至在两者上都尝试了777权限。 – orourkek

+0

我的意思是说php.ini中有browscap设置,它实际上是该文件的路径。检查它指向哪个目录。 –

3

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

所以,尽管PHP中发现的文件,它出现在phpinfo()的输出,下面一行是问题:

browscap = browscap.ini 

有了这条线,getBrowser()回到false

但是,它改变为绝对路径的工作,像这样:

browscap = /etc/browscap.ini 

希望这可以帮助别人!这是一个奇怪的...

+0

有趣的是,这不是我遇到的问题的原因 - 我原本有一个相对路径,但在调试时改为绝对路径。尽管查看相关的[源代码](http://lxr.php.net/xref/PHP_5_3/ext/standard/browscap.c#454)显示了一些返回'FALSE'的地方。 – orourkek