2011-12-08 10 views
6

Domyślam się, że get_headers PHP nie pozwala na kontekst, więc muszę zmienić domyślny kontekst strumienia, aby uzyskać tylko HEAD żądania. Powoduje to problemy z innymi żądaniami na stronie. Nie mogę się domyślić, jak zresetować domyślny kontekst strumienia. Próbuję coś takiego:PHP: get_headers ustawiono tymczasowy stream_context

$default = stream_context_get_default(); //Get default stream context so we can reset it 
stream_context_set_default(//Only fetch the HEAD 
     array(
    'http' => array(
     'method' => 'HEAD' 
    ) 
) 
); 
$headers = get_headers($url, 1); //Url can be whatever you want it to be 
//var_dump($headers); 
var_dump($default); 
stream_context_set_default($default); //This doesn't work as it expects an array and not a resource pointer 

Czy ktoś wie, jak to naprawić?

Wiem, że zasugerowano użycie Curl, ale wolałbym tego nie używać. Dzięki!

+0

get_headers Niespójność: http://stackoverflow.com/questions/12781795/get-headers-inconsistency – Baba

Odpowiedz

8

Skończyło się na użyciu funkcji stream_get_meta_data(), aby uzyskać nagłówki HTTP.

ten sposób I wdrożone go:

function get_headers_with_stream_context($url, $context, $assoc = 0) { 
    $fp = fopen($url, 'r', null, $context); 
    $metaData = stream_get_meta_data($fp); 
    fclose($fp); 

    $headerLines = $metaData['wrapper_data']; 

    if(!$assoc) return $headerLines; 

    $headers = array(); 
    foreach($headerLines as $line) { 
     if(strpos($line, 'HTTP') === 0) { 
      $headers[0] = $line; 
      continue; 
     } 

     list($key, $value) = explode(': ', $line); 
     $headers[$key] = $value; 
    } 

    return $headers; 
} 

Called tak,

$context = stream_context_create(array('http' => array('method' => 'HEAD'))); 
$headers = get_headers_with_stream_context($url, $context, 1); 

daje Ci to, czego po pozostawiając standardową stream_context niezmodyfikowanej.

Należy pamiętać, że ta funkcja nie powiedzie się, jeśli zostanie przekazana coś innego niż adres URL http.

Wygląda na to, że istnieje feature request dla dodatkowego argumentu dla get_headers(), ale narzędzie do śledzenia błędów nie działa, ponieważ to piszę, więc nie mogę sprawdzić innych rozwiązań.

1

Zamiast przyjętej odpowiedzi, zrobiłem co następuje, co będzie działać w PHP 5.3 i wyżej, chociaż nie w pełni przetestowałem to. (Jest też stream_context_get_params($context) ale myślę, że to wystarczy.)

$stream_context_defaults = stream_context_get_options(stream_context_get_default()); 
stream_context_set_default(
    array(
     'http' => array(
      'method' => 'HEAD' 
     ) 
    ) 
); 
for ($i = 1; $i <= 10; $i++) { 
    $headers = get_headers('http://www.example.org'); 
} 
stream_context_set_default($stream_context_defaults); // reset to defaults 
+1

To nie zawsze działa, 'stream_context_set_default()' nie może być "zresetowane" z pustą tablicą $ stream_context_defaults. – powtac

+1

Czy to gdzieś dokumentuje? Wysłałem to w interesie próbowania obejścia braku argumentów dla get_headers. Zdaję sobie sprawę, że być może nie najmądrzej jest ustawić domyślne ustawienia zamiast tworzyć nowy kontekst, ale chciałem ponownie użyć metody get_headers. Byłoby miło, gdyby get_headers miał możliwość przekazania w niestandardowym kontekście, np. File_get_contents. –

+0

Nie widziałem tego wyraźnie w dokumentach. Wyliczyłem to poprzez testowanie. – powtac

4

miałem podobny problem, ale po prostu stosować funkcję file_get_contents ze zwyczajem kontekście zamiast strumienia.

Oto jak I wdrożone go:

$options = array(
       'http' => array(
        'method' => 'HEAD', 
        'follow_location' => 0 
       ) 
      ); 

$context = stream_context_create($options); 

@file_get_contents($url, NULL, $context); 

var_dump($http_response_header); 

Stosując ten kontekst tylko nagłówki zostaną pobrane przez file_get_contents i propaguje zmienną $http_response_header PHP.

Powiązane problemy