3

こんにちは。1 つのドメインから複数のページのコンテンツを取得する必要があります。ここで、各ページに対して fsockopen 接続を使用し、次の方法でページのコンテンツを取得します。

<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET /page1.html HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        fgets($fp, 128);
    }
    fclose($fp);
}

?>

私のスクリプトは、ドメインに再接続して 2 番目のページを取得するために時間を浪費します。次のように、単一の接続を使用して複数のページを取得できるかどうか疑問に思っていました。

<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {

    $out = "GET /page1.html HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        fgets($fp, 128);
    } $out = "GET /page2.html HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        fgets($fp, 128);
    }
    fclose($fp);
}

?>

しかし、このメソッドは page1.html を 2 回返しています。理由はわかりません。

使用しようとしました: 接続: キープアライブ、または HTTP/1.0 ですが、この場合、サーバーから何も取得できませんでした (スクリプトの実行時間は無限です)。

これを解決するための提案はありますか?

ありがとうございました!

4

1 に答える 1

3

Connection: Close最後のリクエストでヘッダーのみを送信してみてください。

編集:明確化

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {

    $out = "GET /page1.html HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    // DON'T SEND Connection: Close HERE
    fwrite($fp, $out);
    while (!feof($fp)) {
        fgets($fp, 128);
    } 

    $out = "GET /page2.html HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    // THIS IS THE LAST PAGE REQUIRED SO SEND Connection: Close HEADER
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        fgets($fp, 128);
    }
    fclose($fp);
}
于 2010-10-19T16:50:38.510 に答える