2011-01-16 1 views
4

У меня есть PHP-скрипт, который должен подключаться к прокси, выбранному из списка прокси-сервера и загружать файл. Некоторые из прокси (из 200-400 работающих) работают отлично, а другие нет, и я не могу понять, почему.PHP: fopen failed «HTTP Request Failed», но заголовок ответа имеет код состояния 200

Вот код, который подключается через прокси-сервер:

$proxy = determine_proxy ($proxyList); 
$proxyString = 'tcp://' . $proxy['ip'] . ':' . $proxy['port']; 

$userAgent = $userAgents [rand (0, $agentsCount - 1)]; 

// set up our headers 
$hdrs = array('http' => array(
    'method' => "GET", 
    'header'=> "Host: www.example.net\r\n" . 
     // "User-Agent: $userAgent\r\n" . 
     "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" . 
     "Accept-Language: en-us,en;q=0.5\r\n" . 
     "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" . 
     "Keep-Alive: 115\r\n" . 
     "Proxy-Connection: keep-alive\r\n" . 
    "Referer: http://$url",  // Setting the http-referer 
    'proxy' => "$proxyString", 
    'request_fulluri' => true 
    ) 
); 

echo "Using proxy: "; print_r ($proxy); echo '<br>'; 

$context = stream_context_create ($hdrs); // set up the context 

$timeout = 3; 
$oldTimeout = ini_set('default_socket_timeout', $timeout); 
$oldAgent = ini_set ('user_agent', $userAgent); 

$fp = fopen ("http://www.example.net$file", 'r', false, $context); // open the file 

if (!$fp) { 
    echo 'fopen failed! Skipping this proxy for now...<br>'; 
    print_r ($http_response_header); echo '<br />'; 
    unset ($http_response_header); 
    flush(); @ob_flush(); 
    ini_set ('user_agent', $oldAgent); 
    ini_set('default_socket_timeout', $oldTimeout); 
    continue; 
} 

print_r ($http_response_header); echo '<br />'; 
unset ($http_response_header); 

Странная вещь в том, что заголовок ответа для неудачных попыток иногда пустой, а иногда это следующим образом:

Array (
[0] => HTTP/1.0 200 OK 
[1] => Server: falcon 
[2] => Date: Sun, 16 Jan 2011 14:06:37 GMT 
[3] => Content-Type: application/x-bittorrent 
[4] => Cache-Control: must-revalidate, post-check=0, pre-check=0 
[5] => Content-Disposition: attachment; filename="example.torrent" 
[6] => Vary: Accept-Encoding,User-Agent 
[7] => Connection: close 
) 

И иногда это:

Array ( 
[0] => HTTP/1.0 200 OK 
[1] => Server: falcon 
[2] => Date: Sun, 16 Jan 2011 14:06:47 GMT 
[3] => Content-Type: application/x-bittorrent 
[4] => Cache-Control: must-revalidate, post-check=0, pre-check=0 
[5] => Content-Disposition: attachment; filename="example2.torrent" 
[6] => Vary: Accept-Encoding,User-Agent 
[7] => X-Cache: MISS from proxy 
[8] => Proxy-Connection: close 
) 

Это ответный заголовок от успешно попытка:

HTTP/1.0 200 OK 
Server: falcon 
Date: Fri, 21 Jan 2011 18:53:00 GMT 
Content-Type: application/x-bittorrent 
Cache-Control: must-revalidate, post-check=0, pre-check=0 
Content-Disposition: attachment; filename="example3.torrent" 
Vary: Accept-Encoding,User-Agent 
X-Cache: MISS from www.example.com 
X-Cache-Lookup: MISS from www.example.com:3128 
Via: 1.0 www.example.com (squid/3.0.STABLE23-BZR) 
Proxy-Connection: close 

Я устанавливаю агента пользователя, чтобы быть действительный строку агента пользователя, я проверил allow_url_fopen и установлено значение Вкл.

Из RFC-2616, раздел 10:

200 OK

Запрос удалось. информация, возвращаемая с ответом зависит от метода, используемого в запросе, например:

получить объект, соответствующий запрошенному ресурсу посылается в ответ ;

Как возможно, что сервер через прокси возвращает статус 200, и все еще fopen терпит неудачу? Кто-нибудь имеет представление о проблеме и как ее исправить?

ответ

2

Проблема была факт, что я устанавливал тайм-аут сокета, который в некоторых случаях был слишком низким для fopen для управления и загрузки всех данных. После того как тайм-аут ушел, и fopen все еще не загрузил данные, он вернул FALSE и выбросил ошибку «HTTP reqeust failed».

+1

Поскольку вы ответили на свой вопрос, отметьте ответ как« Принято ». Это остановит вопрос, появляющийся в списке оставшихся без ответа вопросов, а также поможет любому, кто найдет эту страницу в будущем, ища аналогичный ответ. Спасибо. – Spudley

+0

У меня есть привычка оставлять его открытым на несколько дней, чтобы другие могли ответить на него (возможно, лучше). – Shade

0

сервер сообщил 200 OK, но прокси-сервер еще не знал, куда направить эти данные, так что вы получили запрос не удалось ...

попробуйте использовать VIA заголовок

+0

'Via:' это ответный/форвардный заголовок и только информационный. – mario

+0

Но я также получаю тот же заголовок (первый пример в моем вопросе) в случаях, когда загрузка прошла успешно. Как это возможно? И что вы подразумеваете под «прокси-сервером, который еще не знал, куда пересылать эти данные»? – Shade

+0

Некоторые (старые) прокси-серверы не могут отправить эту базу данных вам, если вы не сообщите им об этом (в каком-то заголовке, который я надел –

Смежные вопросы