Problèmes de cache avec timThumb

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

You can leave a response, or trackback from your own site.

10 Responses to “Problèmes de cache avec timThumb”

  1. [...] complet : sur le siteTéléchargement et documentation du script : Cliquez iciVersion améliorée : Cliquez iciPublié dans Développement webEn ligne depuis le 18 aoûtvar addthis_pub="valou"; Cela peut vous [...]

  2. harvey dit :

    eh ouais ! j’ai chargé ta version, j’ai remplacé mon script Tim par le tien et en avant Guingamp. Donc merci bien !

  3. craagle dit :

    Merci très bon boulot, et merci surtout d’avoir penser a mettre tout le code du fichier, parce que j’ai essayé de suivre votre tuto ça n’a pas marcher, mais en collant tout le code c’est bon, maintenant il ne me reste plus qu’a trouvé le module pour avoir plusieurs articles en slide sur la home.

  4. Nas dit :

    Bonjour à tous,

    Pour commencer, un grand merci pour ce patch qui fait augmenter les perfs d’une manière remarquable.

    Je profite de ce post pour poser une petite question, vu que vous avez déjà bien étudié le code « timthumb.php » et vous saurez me répondre j’espère ^^

    J’utilise ce script pour les générations d’avatars pour un site web. Tout va bien jusqu’à ce que l’utilisateur décide de changer sa photo de profil : le cache conserve l’ancienne photo (vu que la nouvelle photo a écrasé l’ancienne avec le même path), et du coup la mise à jour de l’avatar ne se fait que quelques minutes après le téléchargement de la nouvelle photo, malgré une série de refresh de la page. avez vous une solution à me proposer pour ce petit problème ?

    Merci d’avance

  5. Amity dit :

    Bonjour,
    Je suis tombée sur votre site, car j’ai quelques soucis avec TimThumb, enfin je pense que ça vient de là.
    J’ai créé plusieurs champs personnalisés sur wordpress pour donner un effet magazine via TimThumb.
    Cependant j’ai un soucis quant à l’affichage de ces vignettes qui s’affichent quand elles veulent. A chaque refresh certaines s’affichent, d’autres non. Je me disais que le problème venait du cache, j’ai pris ton script, mais cela n’a rien changé.
    Pourriez-vous m’éclairer ?
    Merci
    Amity

  6. Florian dit :

    Moi j’ai un probleme :

    J’ai un site d’actualité qui rassemble plusieurs sources (j’utilise W-o-matic) et j’ai un thème premium (avec timthumb). Le truc c’est que j’ai aucune de mes vignettes qui s’affiche.
    Pourriez-vous m’éclairer ?
    Merci

  7. Florian dit :

    Merci pour votre aide j’ai résolu mon problème. J’ai ajouter un plugin (auto post thumtnail)c’est pas très propre mais sa marche

  8. xbox dit :

    Pour commencer, un grand merci pour ce patch qui fait augmenter les perfs d’une manière remarquable.
    MERCI!

Leave a Reply

Powered by WordPress and Divioseo