- 在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')));
错误记录
文件结构
这是我怀疑错误来自的地方。 browscap.ini位于/var/php/
,其具有如上所述的适当权限。我的想法是,PHP可能无法访问此目录,或者沿着这些行。但是,此目录也是存储会话的位置,因此不太可能。
“解决方案”
解决了这个问题的原因是将browscap.ini移动到公共Web目录。我很好奇为什么会这样,特别是考虑到无证件的返回值。 “解决方案”有效,但不是我认为我会找到的解决方案......
get_browser()
是否有特殊的权限要求,或类似的东西? file()
可以正常访问目录和文件,但get_browser()
无法(大概)。我几乎已经把头发拉出来解决这个问题,并希望得到一些解决方案!
感谢阅读!
答案 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
希望这有助于某人!这是一个奇怪的...