Timthumb est un fichier php qui permet de génerer et de mettre en cache très facilement les miniatures de vos images sur votre site.
Timthumb serait « presque » parfait si :
- il pouvais mettre en cache les images non hébergées sur votre site
- il était moins gourmand lorsqu’on a des milliers d’images dans le cache
Je suis donc parti de l’excellent travail de Tim MacDaniels (dernière version en date : 1.14) puis j’ai modifié 2 ou 3 bricoles.
J’ai commencé par optimiser la gestion du cache dans la fonction ‘cleanCache’, en effet lorsque le cache devient trop gros cette fonction fait mouliner meme les plus gros serveurs.
J’ai ajouté cette ligne tout en haut de la fonction qui permet de n’analyser le cache que pendant les visites des internaute de la première minute de chaque heure :
if(date('i') != 0) return true;
Attention si aucun internaute ne passe sur le site pendant cette première minute alors le cache n’est pas du tout analysé.
Il est possible de jouer avec les paramètres pour analyser le cache plus souvent mais a ce moment la autant ne pas s’en servir, ce tweak n’est utile que pour les sites a fort trafic avec beaucoup de miniatures en cache (plus de 5000).
Pendant que j’y suis je règle un petit bug de timThumb :
Je remplace :
$files = glob("cache/*", GLOB_BRACE);
par
$files = glob(DIRECTORY_CACHE."/*", GLOB_BRACE);
En effet si vous changiez le nom du répertoire de cache dans la config en début de fichier celui ci n’était pas pris en compte dans le nettoyage du cache…
La deuxième optimisation concerne la fonction ‘cleanSource’ qui empèchait de pouvoir mettre en cache une image hébergé ailleurs (ouuuuuuu c’est mal). Dans la dernière version de timThumb les développeurs ont fait un effort et permettent d’ajouter une liste de sites externes sur lesquels on peut scrapper, il suffit de rajouter un domaine dans le tableau $allowedSites de la fonction ‘checkExternal’.
Pour aller plus loin et vous permettre de scrapper tout ce que vous voulez voici comment désactiver cette protection de timThumb :
Il vous suffit de modifier la fonction ‘cleanSource’ en commentant les lignes suivantes (en mettant // en début de ligne) :
function cleanSource($src) {
//$host = str_replace('www.', '', $_SERVER['HTTP_HOST']);
//$regex = "/^((ht|f)tp(s|):\/\/)(www\.|)" . $host . "/i";
//$src = preg_replace ($regex, '', $src);
//$src = strip_tags ($src);
//$src = checkExternal ($src);
// remove slash from start of string
if (strpos($src, '/') === 0) {
$src = substr ($src, -(strlen($src) - 1));
}
// don't allow users the ability to use '../'
// in order to gain access to files below document root
$src = preg_replace("/\.\.+\//", "", $src);
// get path to image on file system
//$src = get_document_root($src) . '/' . $src;
return $src;
}
Puis d’ajouter un ‘@’ devant filemtime ligne 64 comme ceci (cela empechera une erreur php lorsque timThumb essayera d’obtenir la date de création d’un fichier distant) :
$lastModified = @filemtime($src);
Et enfin de commenter ‘&& file_exists($src)’ dans la condition ligne 95 comme ceci (la fonction php file_exists ne fonctionne pas sur les fichiers distants):
if(strlen($src) /*&& file_exists($src)*/) {
Et voila vous avez un présent un timThumb prêt à affronter des milliers de fichiers en cache avec des milliers de visiteurs par jour en scrappant ou vous le souhaitez !
Source : timThumb.php




