Skip to main content

Gebruik van 404 caching voor afbeeldingen.

Vrijwel alle affiliate productfeeds zijn voorzien van afbeeldingen. De afbeeldingen staan meestal op de server van de webwinkel, in enkele gevallen op de server van het affiliatenetwerk. Het kan aantrekkelijk zijn de afbeeldingen zelf te hosten i.p.v. ze vanaf andere servers te gebruiken:

  1. veel afbeeldingen van verschillende servers kan een trigger voor google zijn: affiliatesite !!!
  2. de afbeeldingen zijn soms erg groot hetgeen in trage pagina’s resulteert.
  3. je kunt de afbeeldingen van een eigen cookie-loos domein aanbieden ( is een advies van google page-speed)

Nu kun je de afbeeldingen allemaal gaan ophalen op het moment dat je de datafeed inleest, de eigenaar van de server zal je dat echter niet in dank afnemen. een interessante optie is het om de plaatjes op te halen als ze nodig zijn en dan locaal op te slaan. Dit mechanisme gebruikt dezelfde truck als ‘404 caching’

Note: er zijn wat problemen in dit artikel met de voorbeelden, joomla knipt nogal wat html code weg. Het kan zijn dat het verhaal daardoor nog iets onbegrijpbaarder is.

De database.

in de database staan 1 of meer tabellen voor de informatie over de items in de feed in opgeslagen staan. Van belang is de tabel met het veld van de afbeelding voorbeeld:

ID,img_url,titel,omschrijving,etc etc

bij gewoon gebruik van de afbeelding plaats je iets als

<img src="/$img_url" border="0" alt="" />

in je code. om over te stappen op eigen afbeeldingen maak je hier van:

<img src="http:/images.example.com/$ID" border="0" alt="" />
 

volgende stap is het '404' gedeelte, dit kan op apache server m.b.v. .htaccess en een error document. Onderstaande voorbeeld gebruikt de rewrite engine:

Rewriteengine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php


de eerste keer dat een afbeelding opgevraagd wordt bestaat deze nog niet en komt 'index.php' in aktie, de volgede keren staat de afbeelding in de 'cache' en gebruikt de webserver deze. Rest nog invulling te geven aan de index.php die de afbeelding ophaalt en bewerkt:

$db_host= “jouw host”;
$db_user= “jouw db user”;
$db_password=“jouw db password”;
$db_database=“jouw db”;
$db_table= “jouw tabel”;

if (!($_resource = mysql_connect( $db_host, $db_user, $db_password, true ))) {
$_errorNum = 2;
$_errorMsg = 'Could not connect to MySQL';
print $_errorMsg;
exit;
}
mysql_select_db( $db_database, $_resource );
$img=(int)$_SERVER['REQUEST_URI']; # int tegen injection
$feed_q="select img from $db_table where id = $img limit 1";
$_feeds=mysql_query($feed_q,$_resource);
@$p=mysql_result($_feeds,0);
if ( ! $p ) {
$p="noimage.jpg";
}
createthumb($p,$img,150,150);

#haalt de afbeelding op ( $name ) maakt er een standaard formaat van
#plaats de afbeelding in de directory en stuurt deze als response
function createthumb($name,$filename,$new_w,$new_h)
{
$src_img=false;
$name=str_replace(array('[',']',' '),array('%5B','%5D','%20'),$name);
$src_img=imagecreatefromstring(file_get_contents($name));
if ( ! $src_img ) {
if (preg_match("/(jpg|jpeg)$/i",$name)){
$src_img=imagecreatefromjpeg($name);
}
if (preg_match("/gif$/i",$name)){
$src_img=imagecreatefromgif($name);
}
if (preg_match("/png$/i",$name)){
$src_img=imagecreatefrompng($name);
}
}
if ( ! $src_img ) {
error_log("No IMAGE $name");
$src_img=imagecreatefromjpeg('noimage.jpg');
}
$old_x=imageSX($src_img);
$old_y=imageSY($src_img);
if ($old_x > $old_y)
{
$thumb_w=$new_w;
$thumb_h=$old_y*($new_h/$old_x);
}
if ($old_x < $old_y)
{
$thumb_w=$old_x*($new_w/$old_y);
$thumb_h=$new_h;
}
if ($old_x == $old_y)
{
$thumb_w=$new_w;
$thumb_h=$new_h;
}
$d_h=$thumb_h > 200?200:$thumb_h;
$dst_img=ImageCreateTrueColor($thumb_w,$d_h);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y);
imagejpeg($dst_img,$filename);
header("Content-type: image/jpg");
imagejpeg($dst_img);
imagedestroy($dst_img);
imagedestroy($src_img);
}



Dit is een basic script, als je veel afbeeldingen hebt is het verstandig met sub-mappen te werken; het script lost het probleem van niet bestaande afbeeldingen slechts deels op. Het script zal gewijzigde afbeeldingen niet oppikken; sommige feeds gebruiken dezelfde afbeelding verschillende keren, je zou kunnen overwegen een hash van de image url te gebruiken:

<img src="http:/images.example.com/crc32($img_url)" border="0" alt="" />

en de query om de afbeelding uit de database te halen ook aan te passen. Dit lost ook het probleem op als een product een andere img url krijgt