Получить несколько страниц с помощью одного fsockopen - PullRequest
3 голосов
/ 19 октября 2010

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

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

Спасибо!

1 Ответ

3 голосов
/ 19 октября 2010

Попробуйте только отправить заголовок 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);
}
...