8 Stimmen

PHP: get_headers setzt temporären stream_context

Ich schätze, dass PHPs get_headers keinen Kontext zulässt, so dass ich den Standard-Stream-Kontext ändern muss, um nur den HEAD einer Anfrage zu erhalten. Dies verursacht einige Probleme mit anderen Anfragen auf der Seite. Ich kann nicht herausfinden, wie ich den Standard-Stream-Kontext zurücksetzen kann. Ich versuche etwas wie:

$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

Kennt jemand eine Lösung für dieses Problem?

Ich weiß, dass es vorgeschlagen wurde, Curl zu verwenden, aber ich würde das lieber nicht tun. Danke!

10voto

Peter Punkte 26730

Am Ende habe ich die stream_get_meta_data() Funktion, um die HTTP-Header zu erhalten.

So habe ich es umgesetzt:

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;
}

So wird es genannt,

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

gibt Ihnen, was Sie suchen, während der Standard stream_context unverändert bleibt.

Bitte beachten Sie, dass diese Funktion fehlschlägt, wenn eine andere als eine http-URL übergeben wird.

Es scheint eine Feature-Anfrage für ein zusätzliches Argument für get_headers(), aber der Bugtracker ist nicht verfügbar, während ich dies schreibe, also kann ich dort nicht nach anderen Lösungen suchen.

5voto

codealfa Punkte 91

Ich hatte ein ähnliches Problem, aber ich habe einfach die file_get_contents Funktion mit dem benutzerdefinierten Stream-Kontext zu verwenden.

Ich habe es folgendermaßen umgesetzt:

$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);

In diesem Kontext werden nur die Kopfzeilen von file_get_contents und füllt den $http_response_header PHP-Variable.

1voto

Louis St-Amour Punkte 3955

Anstelle der akzeptierten Antwort habe ich folgendes getan, das in PHP 5.3 und höher funktionieren wird, obwohl ich es nicht vollständig getestet habe. (Es gibt auch eine stream_context_get_params($context) aber ich denke, das reicht aus.)

$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

0voto

Mahmoud Punkte 415

Ab PHP 7.1.0, get_headers() akzeptiert nun einen dritten Parameter für den Kontext.

$context = stream_context_create(
    array(
        'http' => array('method' => 'HEAD')
    )
);

$headers = get_headers($url, true, $context);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X