0

使用 PHP,我正在访问一个外部 URL,它是一个 XML 提要文件,并且我正在将结果解析到我的数据库中。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 压缩,但我似乎正在访问非压缩文件。

编辑:我从提要的所有者那里得到了这段代码,这些代码应该是如何解决这个问题的说明,但这似乎是在 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);
4

1 回答 1

1

扩展我的评论,如果请求的Accept-Encoding标头包含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 请求的库。

于 2013-09-15T18:26:42.003 回答