1
set_time_limit(0);
$ch = curl_init('http://www.tibia.com/community/?subtopic=highscores&world=Antica');
curl_setopt($ch, CURLOPT_RANGE, '0-999');
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
echo $data = curl_exec($ch);//get curl response
curl_close($ch);

示例输出是(每次我点击刷新按钮时都会略有不同):
‹í]kSã8ºþNÕüOÍÕr™&™,³ÜÒ3{æ¥8J¢Æ±2¾é=ûßÏ«‹Û±BãYÜåž,[¥÷òHz%[ ÎÁØ›XÖÆàˆÐG=‹tz´O1ª S‡té[ZxF tm[Ô&è–YÝÀ%jÐ'¿½?¿<ütrÇË‹_X_BD1‡Ýîõç«^¤œàŠ(Èå%ÓwH¤$lšÌ·½°¨Ñý)s&W¼‰ ǯRb ¢‰Ð{dЪ zp×½=¿é¡ÞÿÞœ,úµ³vð·JU«0D@EÔ²ˆ³æ¯G'„A{Û0Ì1tjä´ÜØ4þŽšµZmóãÚзMÞÆQ4{íßà=:DSì@³ß ò2Ý-‹Ø#oŒ:¨ ± ‰þ-üË1}‡=¹Äéͦ¨ÝF%F‹ºßb²#i~éO¢W> à]û\b ·<6]~ßÿÿ?kv¥&¨JuÖÖÞ®PB)¶èWm ƒÁþ~}¿ ÖÜÛö÷wš ÒØ®Õ04IØÜ!õdS€1½ªuHö

当我注释掉 CURLOPT_RANGE 时页面显示正确

编辑:我添加 curl_setopt($ch, CURLOPT_ENCODING, "gzip"); 输出似乎没问题,但仅当范围以 0 开头时。如果范围是例如 2000-3000,则它完全不输出任何内容。

编辑2:错误消息是:“处理内容未编码时出错:无效距离太远”

4

2 回答 2

3

您正在获取 gzip 压缩的内容。您应该明确声明您希望返回纯 HTML。您可以添加以下选项:

curl_setopt($ch, CURLOPT_ENCODING, 'deflate');
于 2013-02-12T20:40:52.393 回答
2

我从未使用过 CURLOPT_RANGE。你有理由需要使用它吗?

gzip 仅在您从 0 开始时才起作用的原因是那里有需要解压缩内容的信息。如果您必须使用 Range,那么您应该捕获每个范围的数据并将其组合,然后解压缩。

编辑:

您在一些评论中提到您使用 Range 来获取一些数据以节省带宽。我使用 Firebug 检查了该页面,它小于 10kb。加上所有的图像,它几乎是 500k。您已经节省了很多钱,除非您使用 10kb 拨号上网,否则没什么。不用担心使用 Range 和组合块,只需让 cURL 处理 gzip。

于 2013-02-12T20:26:10.813 回答