Получите несколько страниц с одним fsockopen

Привет всем. Мне нужно получить содержимое нескольких страниц из одного домена. Теперь для каждой страницы я использую соединение 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);
}

?>

Мой скрипт тратит время, с переподключением к домену, чтобы получить вторую страницу. Мне было интересно, можно ли использовать одно соединение и получить несколько страниц, например:

<?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 два раза, я не знаю почему.

Я пытался использовать: Соединение: сохранить активность или HTTP/1.0, но в этом случае я ничего не получил от сервера (бесконечное время выполнения моего скрипта).

Любое предложение решить эту проблему?

Спасибо!


person Tamás Pap    schedule 19.10.2010    source источник


Ответы (1)


Попробуйте отправить заголовок Connection: Close только в последнем запросе.

EDIT: уточнение

$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);
}
person rojoca    schedule 19.10.2010
comment
Если я отправлю только Connection: Close, как сервер узнает, что мне нужно получить страницу page2.html? - person Tamás Pap; 19.10.2010
comment
Вы по-прежнему отправляете все остальные заголовки для каждой страницы, но отправляете только Connection: Close для последней страницы. - person rojoca; 20.10.2010
comment
Бесконечное время загрузки..в данном случае..Все равно спасибо ;) - person Tamás Pap; 20.10.2010
comment
Я думаю, вам нужно отправить все запросы, прежде чем вы начнете читать ответ. В соответствии со спецификацией HTTP 1.1 все ответы должны возвращаться в правильном порядке, но вам придется вручную разделить их. - person rojoca; 20.10.2010