2010-10-19 4 views
3

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

Любые предложения по этому вопросу?

Спасибо!

ответ

3

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

Если я посылаю только соединения: Close, как будет сервер знает, что мне нужен тх page2.html, чтобы восстановить? –

+0

Вы по-прежнему отправляете все остальные заголовки для каждой страницы, но только отправляете 'Connection: Close' для последней страницы. – rojoca

+0

Бесконечное время загрузки .. в этом случае .. В любом случае, спасибо;) –