使用压缩来获取外部XML Feed

时间:2013-09-15 17:48:56

标签: php xml gzip

使用PHP,我正在访问外部URL,这是一个XML feed文件,我正在将结果解析到我的数据库中。 XML文件很大,大约27 MB。

如何在启动数据传输之前压缩该文件,以便收到小于27 MB的内容?我的猜测是应该使用gzip,但我不知道如何。

这是我用于从XML文件中检索数据的代码:

$url = "http://www.website.com/feed.xml";
$xmlStr = file_get_contents("$url") or die("can't get file");
$xmlLinq = simplexml_load_string($xmlStr);

编辑:该文件已经使用默认的gzip / deflate压缩,但我似乎正在访问非压缩文件。

编辑:我从feed的所有者那里获得了这段代码,那些应该是如何解决这个问题的指令,但这似乎是在C#中。我需要PHP中的等价物:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 60000;
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
request.KeepAlive = false;
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9) Gecko/2008052906 Firefox/3.0 (.NET CLR 3.5.30729)";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
if (response.ContentEncoding.ToLower().Contains("gzip"))
responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
else if (response.ContentEncoding.ToLower().Contains("deflate"))
responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);
StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);

1 个答案:

答案 0 :(得分:1)

扩展我的评论,如果请求的Accept-Encoding标头包含gzip,则网络服务器只会发送使用Gzip压缩的内容。要触发包含此标头的请求,您可以使用以下命令:

$url = "http://www.website.com/feed.xml";
$curl = curl_init($url);
curl_setopt_array($curl, array(
        CURLOPT_ENCODING => '', // specify that we accept all supported encoding types
        CURLOPT_RETURNTRANSFER => true));
$xml = curl_exec($curl);
curl_close($curl);

if($xml === false) {
    die('Can\'t get file');
}

$xmlLinq = simplexml_load_string($xml);

这使用cURL扩展名,这是一个非常灵活的库,用于发出HTTP请求。