Bauchladen hat geschrieben:Solange es keine Redirects gibt und man keine HTTP Fehlercodes braucht.
Den Statuscode kann man auch relativ leicht ermitteln und ein Redirect ist jetzt auch nicht so die Hürde. Ich hab hier mal schnell eine Funktion dafür zusammengezimmert:
Code: Alles auswählen
function get_url($url, &$http_status, $count = 1) {
$url_parts = parse_url($url);
$port = (isset($url_parts['port'])) ? $url_parts['port'] : 80;
$query = (isset($url_parts['query'])) ? '?'.$url_parts['query'] : '';
if ($fp = @fsockopen($url_parts['host'], $port, $errno, $errstr, 30)) {
fputs($fp, 'GET '.$url_parts['path'].$query." HTTP/1.0\r\n");
fputs($fp, 'Host: '.$url_parts['host']."\r\n");
fputs($fp, "User-Agent: PHP\r\n");
fputs($fp, "Connection: close\r\n\r\n");
$in_body = FALSE;
$body = '';
while (!feof($fp)) {
$line = fgets($fp, 128);
if ($in_body) {
$body .= $line;
} elseif (preg_match('=HTTP/1\.[1|0]\s([0-9]{3})=si', $line, $match)) {
$http_status = $match[1];
} elseif (preg_match('=Location:(.*)=si', $line, $match)) {
$http_location = trim($match[1]);
} elseif ($line == "\r\n") {
$in_body = TRUE;
}
}
fclose($fp);
if (in_array($http_status, array(301, 302, 303, 307))) {
if ($count > 20) {
print('Fehler: Redirect Limit überschritten');
return FALSE;
} elseif (!empty($http_location)) {
return get_url($http_location, $http_status, $count+1);
}
} elseif (in_array($http_status, array(200, 201, 202, 204, 205))) {
return $body;
} else {
return FALSE;
}
} else {
$http_status = -1;
return FALSE;
}
}
if ($content = get_url('http://w3.org/', $status)) {
print($content);
} else {
print('Fehler: '.$status);
}
Ist jetzt nicht groß getestet, sollte aber eigentlich funktionieren.
Bauchladen hat geschrieben:Irgendwann wundert man sich dann warum das Skript nicht mehr geht und merkt dann 3 Threads und 7 Tage später dass man das doch gleich von Anfang an richtig hätte machen sollen.
Dann fehlt in deinem Beispiel aber auch noch eine rudimentäre Fehlerüberprüfung.
