anpera.net
http://anpera.homeip.net/phpbb3/

Timeout für Avatare (http-header prüfen)
http://anpera.homeip.net/phpbb3/viewtopic.php?f=43&t=5329
Seite 1 von 1

Autor:  Charon [ So 10 Apr, 2011 16:01 ]
Betreff des Beitrags:  Timeout für Avatare (http-header prüfen)

Hallo,

hier eine kleine Modifikation für die Bio im Standard-Release. Der ein oder andere kennt es: der Server mit dem verlinkten Avatar streikt gerade, das getimagesize hängt entsprechend ewig und am Ende gibts statt der Bio irgendwann eine weiße Seite. Da getimagesize kein eigenes timeout kennt, habe ich mal nach einer gescheiten Lösung gesucht.

Die sieht so aus, dass nun per cURL erstmal nur die http-header geholt werden und auch auf den Statuscode geschaut wird. Dabei lässt sich netter Weise ein timeout definieren, wobei ich jetzt default 5 Sekunden gewählt habe. Unten stehende Funktion habe ich im Kern in einem Beitrag unter http://de.php.net/curl gefunden und ein bisschen angepasst. Wer möchte, kann damit auch gezielt auf einen bestimmten Statuscode abfragen.

Voraussetzung:
cURL muß auf dem Server installiert und aktiv sein.
Wer lokal mit xammp testet, muß hierzu ggf. in der php.ini das Semicolon vor extension=php_curl.dll herausnehmen.

Einbau:

1) Folgende Funktion entweder oben in die bio.php kopieren, oder in die common.php, wenn man sie noch anderweitig brauchen kann.

$this->bbcode_second_pass_code('', '
function http_response($url, $status = null, $timeout = 5)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_NOBODY, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$head = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if(!$head)
{
return FALSE;
}

if($status === null)
{
if($httpCode < 400)
{
return TRUE;
}
else
{
return FALSE;
}
}
elseif($status == $httpCode)
{
return TRUE;
}

return FALSE;
}
')

2) bio.php

suche:
$this->bbcode_second_pass_code('', '
if ($row[avatar]){
$pic_size = @getimagesize($row[avatar]);
$pic_width = $pic_size[0];
$pic_height = $pic_size[1];
output("<table><tr><td valign='top'>`n`n<img src=\"$row[avatar]\" ",true);
if ($pic_width > 200) output("width=\"200\" ",true );
if ($pic_height > 200) output("height=\"200\" ",true );
output("alt=\"".preg_replace("'[`].'","",$row[name])."\">&nbsp;</td><td valign='top'>",true);
} else {
output("<table><tr><td>(kein Bild)&nbsp;&nbsp;&nbsp;</td><td>",true);
}
')
und ersetze mit:
$this->bbcode_second_pass_code('', '
if ($row['avatar'])
{
if (http_response($row['avatar']))
{
$pic_size = @getimagesize($row['avatar']);
$pic_width = $pic_size[0];
$pic_height = $pic_size[1];
output("<table><tr><td valign='top'>`n`n<img src=\"".$row['avatar']."\" ",true);
if ($pic_width > 200) output("width=\"200\" ",true );
if ($pic_height > 200) output("height=\"200\" ",true );
output("alt=\"".preg_replace("'[`].'","",$row['name'])."\">&nbsp;</td><td valign='top'>",true);
}
else
{
output("<table><tr><td>(Avatar nicht erreichbar)&nbsp;&nbsp;&nbsp;</td><td>",true);
}
}
else
{
output("<table><tr><td>(kein Bild)&nbsp;&nbsp;&nbsp;</td><td>",true);
}
')

Gruß
Charon

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/