2012-06-12 216 views
0

我试图在PHP中将this CrunchBase API page作为字符串获取。当我在浏览器中访问该页面时,我会得到完整的响应(大约230K字符);然而,当我尝试在脚本中获取页面时,响应时间要短得多(服务器上24341个字符,本地36629个字符,其他长CrunchBase页面的字符数完全相同)。要获得页面,我使用的功能几乎与drupal_http_request()完全相同,但我没有使用Drupal。 (我也尝试过使用cURL和file_get_contents(),并得到了相同的结果。现在我正在考虑它,我过去曾经在Python中使用过CrunchBase。)HTTP请求获取部分响应

什么可能导致这种情况,我该如何解决它? PHP 5.3.2,Apache 2.2.14,Ubuntu 10.04。以下是对响应的其他详细信息:

[protocol] => HTTP/1.1 
[headers] => Array 
    (
     [content-type] => text/javascript; charset=utf-8 
     [connection] => close 
     [status] => 200 OK 
     [x-powered-by] => 
     [etag] => "d809fc56a529054e613cd13e48d75931" 
     [x-runtime] => 0.00453 
     [content-length] => 230310 
     [cache-control] => private, max-age=0, must-revalidate 
     [server] => nginx/1.0.10 + Phusion Passenger 3.0.11 (mod_rails/mod_rack) 
    ) 

我不认为这是我在请求中使用User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6用户代理的问题。

UPDATE

根据this thread我需要的Accept-Encoding: gzip, deflate头添加到请求。这确实会导致更长的请求结果,但现在我必须弄清楚如何夸大它。 gzinflate()函数失败,出现Warning: Data error。有关如何夸大回应的想法?

回答

2

请参阅关于gzinflate()的PHP文档中的注释,特别是有关剥离最初字节的注释。该last comment为我做的伎俩:

<?php $dec = gzinflate(substr($enc,10)); ?> 

虽然似乎被剥离的字节数取决于原始编码器。 Another comment有一个更彻底的解决方案,并参考RFC1952进一步阅读。

显然gzdecode()是为了解决这个问题,但它还没有发布。

ps - 我删除了关于返回的数据是纯文本的评论。我错了。

+0

这似乎工作。谢谢!最无法证明的魔力。 – IceCreamYou