【发布时间】: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