file_get_contents 上的未定义索引(HTTP 用户代理)

Undefined Index (HTTP USER AGENT) on file_get_contents

我目前正在尝试查询一个 API 系统(return 是 XML),当我使用 file_get_contents 和 URL:

http://bcoddsfeed.goldenpalace.be/getXML.php

然而,在我找到一个游戏 ID 并将 ?gameid=ID 添加到 URL 之后,我得到了一个非常奇怪的错误(这似乎阻止了我通过 json_encode 和 json_decode 将其转换为多级数组)。 URL 不起作用的一个例子是:

http://bcoddsfeed.goldenpalace.be/getXML.php?gameid=1130733827

当我对检索到的数据使用 var_dump 时,我以一种有点混乱的格式取回它,并在开头出现以下 HTTP_USER_AGENT 错误,这让事情变得一团糟。

Notice: Undefined index: HTTP_USER_AGENT in /usr/local/www/bcoddsfeed.goldenpalace.be/getXML.php on line 29

完整的输出类似于:

string(6502) "
Notice: Undefined index: HTTP_USER_AGENT in /usr/local/www/bcoddsfeed.goldenpalace.be/getXML.php on line 29
2015-01-18 10:00:00Match ResultW24.6W11.81X3.2<_1X12X2>Double Chance1X1.13121.27X21.88Total Goals: Over/UnderTotal Goals Under | 5.51.01Total Goals Over | 5.511Total Goals: Over/UnderTotal Goals Under | 3.51.15Total Goals Over | 3.54.5Total Goals: Over/UnderTotal Goals Under | 14.95Total Goals Over | 11.12Total Goals: Over/UnderTotal Goals Under | 31.22Total Goals Over | 33.75Total Goals: Over/UnderTotal Goals Over | 21.82Total Goals Under | 21.88Total Goals: Over/UnderTotal Goals Under | 0.56.75Total Goals Over | 0.51.07Total Goals: Over/UnderTotal Goals Over | 4.510Total Goals: Over/UnderTotal Goals Under | 41.05Total Goals Over | 47.5Total Goals: Over/UnderTotal Goals Over | 1.51.45Total Goals Under | 1.52.5Total Goals: Over/UnderTotal Goals Under | 2.51.5Total Goals Over | 2.52.4Goals of Team 2Goals of Team 2 Over | 2.511Goals of Team 2 Under | 2.51.01Goals of Team 1Goals of Team 1 Under | 21.25Goals of Team 1 Over | 23.5Goals of Team 2Goals of Team 2 Over | 12.85Goals of Team 2 Under | 11.35Goals of Team 2Goals of Team 2 Over | 1.54.5Goals of Team 2 Under | 1.51.15Goals of Team 1Goals of Team 1 Under | 1.51.6Goals of Team 1 Over | 1.52.15Goals of Team 1Goals of Team 1 Over | 11.45Goals of Team 1 Under | 12.5Goals of Team 1Goals of Team 1 Under | 2.51.15Goals of Team 1 Over | 2.54.5Asian HandicapAsian Handicap 2 | 2.51.05Asian Handicap 1 | -2.57.5Asian HandicapAsian Handicap 2 | 1.51.27Asian Handicap 1 | -1.53.3Asian HandicapAsian Handicap 1 | -25.5Asian Handicap 2 | 21.1Asian HandicapAsian Handicap 2 | 11.45Asian Handicap 1 | -12.5Asian HandicapAsian Handicap 2 | 03.05Asian Handicap 1 | 01.32Correct Score2:07.41:05.20:2231:2161:41602:41806:02105:1955:21902:193:014.53:118.53:2420:071:16.42:2210:19.46:1211:3500:3653:31002:3604:1404:0344:31804:2900:41804:42303:42705:075"

有没有人知道如何解决这个 HTTP_USER_AGENT 问题并得到一个漂亮干净的 xml 字符串,我可以将它转换成 .json 用于我的 php申请?我对此非常缺乏经验,任何帮助将不胜感激,因为我完全迷失了。

我用浏览器访问 link 时没有看到这个错误,所以我不确定发生了什么。

谢谢!

我也试过使用下面的 curl 函数通过 URL 调用数据,但没有成功。我仍然遇到同样的错误。

CURL 函数

    public static function get_data($url) {
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}

看来这个“API”写得不好。它期望向它发出的每个请求都包含一个 User-Agent 请求 header – 并且没有考虑到并非每个客户端都可能发送一个请求。 (您的浏览器通常会这样,这就是为什么当您在浏览器中访问 URL 时不会遇到该错误,但您的 PHP 脚本显然不会。)

现在这个 API 只是试图访问这个值而不检查它是否真的存在;因为它似乎是用 PHP 编写的,很可能是通过 $_SERVER['HTTP_USER_AGENT'] 编写的——如果客户端没有发送这样的 header,它会生成关于未定义索引的 PHP 通知.

要真正修复,这将是拼凑这个 API 的人的工作。如果他们要求一个User-Agentheader与请求一起发送,那么他们的脚本应该检查是否有这样的值已设置,如果未设置则“优雅地”失败,f.e。通过返回某种错误消息 XML.

作为解决方法,您可以让 file_get_contents 在您的脚本中发送 User-Agent header。
在运行时使用 ini_setuser_agent 配置值设置一个值应该就足够了。您是否需要发送一个 specific User-Agent(就像普通浏览器会发送的那样),或者如果任何值都足够,您必须尝试看看。很可能任何值都可以。

如果这不起作用,或者您需要发送任何额外的 headers,那么请参考这个 SO 问题:PHP file_get_contents() and headers


编辑:使用 cURL 你当然会遇到同样的问题,除非你指定 User-Agent 这样 API 就不会失败。您可以使用 curl_setoptCURLOPT_USERAGENT 选项来做到这一点。