0

PHP を使用して、XML フィード ファイルである外部 URL にアクセスし、結果をデータベースに解析しています。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私のコメントを拡張すると、リクエストのヘッダーに含まれている場合、Webサーバーは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);

これは、cURLHTTP リクエストを作成するための非常に柔軟なライブラリである拡張機能を使用します。

于 2013-09-15T18:26:42.003 に答える