La soluzione migliore è quella di salvare un copia dell'immagine se non è presente.

fai cosi:
il browser richiede l'immagine.
il server controlla nella dir e se c'è la miniatura la mostra.

Se la miniatura non c'è la crea e la salva per le prossime richieste.

Per creare la miniatura ti posso dare questa funzione:

Codice PHP:
/**
 * make_thumb_square()
 *
 * @param mixed $image : L'immagine da croppare
 * @param mixed $a : altezza dell'immagine
 * @param mixed $l : Larghezza dell'immagine
 * @param mixed $final : dimensioni finali dell'immagine
 * @param mixed $dir_to_put : dove mettere la miniatura creata
 * @param mixed $path : path del sito
 * @return : crea l'immagine croppata nella dir indicata
 */
function make_thumb_square ($image,$a,$l,$final,$dir_to_put,$path) {

    
# estensione per creare le immagini
    
$estensione explode(".",strtolower($image));
    
$ext array_pop($estensione);

    
# preparo lo switch per il tipo esatto di funzione in base al tipo d'immagine
    
switch($ext){
    default:
        
$funzione_image_create "ImageCreateFromJpeg";
        
$funzione_image_new "ImageJpeg";
    break;
    case 
"jpg":
        
$funzione_image_create "ImageCreateFromJpeg";
        
$funzione_image_new "ImageJpeg";
    case 
"jpeg":
        
$funzione_image_create "ImageCreateFromJpeg";
        
$funzione_image_new "ImageJpeg";
    break;
    case 
"png":
        
$funzione_image_create "ImageCreateFromPng";
        
$funzione_image_new "ImagePng";
    break;
    case 
"gif":
        
$funzione_image_create "ImageCreateFromGif";
        
$funzione_image_new "ImageGif";
    break;
    }

    
$quality_thumb = ($ext == 'png') ? '8' '80';

    
# vedo in quale cartella si trova l'immagine
    
$file $path.'/'.urldecode($image);
    
$file_thumb $path.'/'.$dir_to_put.'/'.urldecode($image);

    
$centerX $a/2;
    
$centerY $l/2;

    if( 
$l $a ){
      
$luy 0;
      
$lux $centerY-$centerX;
      
$rdy $a;
      
$rdx $a;
    }
    else{
      
$lux 0;
      
$luy $centerX-$centerY;
      
$rdx $l;
      
$rdy $l;
    }

    
# restituisce un elemento identificativo per l'immagine data
    
$img_original $funzione_image_create($file);

    
//ImageCreateTrueColor: funzione per creare un'immagine con illimitati colori e con altezza e lunghezza dati
    
$img_final ImageCreateTrueColor($final,$final);

    
# funzione per ridurre le immagini:
    /*    il primo argomento è il nome della nuova immagine,
        il secondo è il nome originale,
        i quattro prossimi valori sono le porzioni di immagine da prendere
        (se messe a zero prende tutta l'immagine originale),
        gli ultimi quattro valori sono le dimensioni delle due immagini. */

    
imagecopyresampled($img_final$img_original00$lux$luy$final$final$rdx$rdy);

    
//questa funzione crea fisicamente il nuovo file
    
$funzione_image_new($img_final$file_thumb$quality_thumb);

    
//queste due funzioni liberano la memoria dalle immagini create
    
ImageDestroy($img_original);
    
ImageDestroy($img_final);


# end make_thumb_square