基本上我正在尝试获取足球比赛的实时比分并将它们添加到我服务器上的个人数据库中。这几乎可以按预期工作,除了一件事:
我使用 PHP 脚本自动获取分数并将其插入数据库。我使用 uefa.com 网站作为来源。让我给你举个例子:
这个http://www.uefa.com/under21/season=2017/matches/live/day=20/session=1/match=2016266/index.html是追踪当前比分的路径。此页面使用此 JSON 文件每分钟更新一次:http ://www.uefa.com/livecommon/match-centre/cup=13/season=2017/day=20/session=1/match=2016266/feed/minute .json(后来称为$json_url)。使用 FireBug 或类似工具时,可以看到 HTTP GET 请求(由页面上的 JS 发起)响应的 JSON 是“活的”,它的内容经常变化。然而,当通过 PHP ( ) 获取 JSON 时file_get_contents($json_url)
,响应似乎每隔几分钟就会改变一次;它似乎以某种方式缓存。
我对 HTTP 标头和其他内容进行了一些测试和分析,我得到的结果是使用 linux cli cURL可以完美地获取 JSON,而不会出现这种类似缓存的现象。
当然,我现在尝试使用 PHP 的 cURL 插件来实现这一点,但是 - 与以前的情况相比没有效果。现在我详细比较了这两个 cURL 请求的作用,并且它们的作用完全相同。但是,它们会返回不同的 HTTP 标头:
这是curl -v $json_url的输出:
* About to connect() to www.uefa.com port 80 (#0)
* Trying 95.100.248.114...
* connected
* Connected to www.uefa.com (95.100.248.114) port 80 (#0)
> GET /livecommon/match-centre/cup=13/season=2017/day=20/session=1/match=2016266/feed/minute.json HTTP/1.1
> User-Agent: curl/7.26.0
> Host: www.uefa.com
> Accept: */*
>
* additional stuff not fine transfer.c:1037: 0 0
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 200 OK
< Cache-Control: public, max-age=300, must-revalidate
< Content-Type: application/json
< Last-Modified: Wed, 07 Oct 2015 20:37:55 GMT
< ETag: "16ec79b401d11:0"
< Server: Microsoft-IIS/7.5
< X-Powered-By: ASP.NET
< Date: Wed, 07 Oct 2015 21:57:53 GMT
< Content-Length: 285
< Connection: keep-alive
<
* Connection #0 to host www.uefa.com left intact
[JSON DATA...]
* Closing connection #0
现在是PHP-cURL 发送的:
* About to connect() to www.uefa.com port 80 (#0)
* Trying 95.100.248.114...
* connected
* Connected to www.uefa.com (95.100.248.114) port 80 (#0)
> GET /livecommon/match-centre/cup=3/season=2016/day=20/session=1/match=2016266/feed/minute.json HTTP/1.1
User-Agent: curl/7.26.0
Host: www.uefa.com
Accept: */*
* additional stuff not fine transfer.c:1037: 0 0
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 200 OK
< Cache-Control: private
< Content-Length: 285
< Content-Type: application/json; charset=utf-8
< Expires: Wed, 07 Oct 2015 21:38:54 GMT
< Server: Microsoft-IIS/7.5
< X-AspNet-Version: 2.0.50727
< X-Accel-Cache-Control: max-age=600
< X-Powered-By: ASP.NET
< Date: Wed, 07 Oct 2015 21:28:54 GMT
< Connection: keep-alive
<
* Connection #0 to host www.uefa.com left intact
* Closing connection #0
(请注意,这些响应中的日期不是问题——这场比赛在我测试命令之前就完成了)
我认为Cache-Control: private
第二个块的 HTTP 响应标头中存在问题,它应该Cache-Control: public, max-age=300, must-revalidate
像第一个一样;但是,我想知道为什么标题完全不同!据我了解,请求标头完全相同。php curl 块的一些注释:我在 PHP 中使用了最基本的 curl 请求,但添加了curl_setopt($ch, CURLOPT_USERAGENT, 'curl/7.26.0');
其他使用 curl 的用户代理。
我对此束手无策 - 有谁知道我做错了什么,或者至少可以解释差异来自哪里?我很感激任何帮助!