使用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);
答案 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请求。