In meinem vorherigen Post (cURL: Verbindung herstellen) habe ich darüber berichtet, wie man mit der in PHP integrierten Bibliothek cURL eine URL aufruft - unter anderem um einen Webservice aufzurufen oder andere Dateien auszulesen. Die Grundlagen haben wir schon mal, um nun weiter zu gehen. In manchen Fällen möchte man die Header auslesen, nicht alle, sondern eventuell nur einen und die bestimmten Inhalte weiterverarbeiten. Dazu bietet sich ganz gut die Konstante CURLOPT_HEADERFUNCTION an. In dieser definiert man einen Funktionsnamen. Diese Callback Funktion wird bei jedem Lesen eines Headers aufgerufen und darauf angewendet. Man kann somit zum Beispiel reguläre Ausdrücke anwenden und bestimmte Strings aus den Headers auslesen.
<?php
// URL, die aufgerufen werden soll
$uri = "http://www.curl-weburl-oder-webservice.de/demo";
// Initiallisieren der Verbindung
$ch = curl_init();
// Konstanten-Werte setzen
curl_setopt($ch, CURLOPT_URL, $uri);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
// Ausführen einer Verbindung
$result= curl_exec($ch);
// Verbindung schließen
curl_close($ch);
?>
Somit haben wir für diese Verbindung eine Callback-Funktion angegeben. Nun implementieren wir noch die Funktion, als Beispiel soll der Location-Header ausgelesen werden, sofern dieser gesetzt ist:
function read_header($ch, $string) {
if(preg_match("/^Location: (.*)?/", $string, $matches)) {
$location = trim($matches[1]);
}
return strlen($string);
}
Der reguläre Ausdruck /^Location: (.*)?/ matched auf Strings, die mit Location: anfangen. Der Returnwert der Callback-Funktion muss gesetzt sein. In unserem Beispiel steht die Konstante CURLOPT_FOLLOWLOCATION auf FALSE. Andernfalls wird dem "Location: "-Header gefolgt.
Noch ein Tipp, wenn die eigene Callback Methode nicht gefunden werden sollte:
curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(&$this,'read_header'));
Falls die Funktionen in einer Klasse (class) definiert werden, dann wird die Konstante mittels array gesetzt.