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

Domain Name System et SEO

J’ai décidé d’écrire cet article pour expliquer à un plusieurs amis a quoi servent les DNS et quelle est leur importance dans le SEO. C’est le premier article d’une série de ‘tutoriels’ un peu à la manière de seoguide.

Je vais commencer par pomper m’inspirer de wikipédia  :

Le Domain Name System (ou DNS, système de noms de domaine) est un service permettant d’établir une correspondance entre une adresse IP et un nom de domaine et, plus généralement, de trouver une information à partir d’un nom de domaine.

Un exemple :

Le nom de domaine blog.divioseo.fr est pointé sur l’adresse IP 91.121.38.165, c’est un peu (en très gros hein) comme le code postal qui correspond à un village ou une ville (Dijon -> 21000)

Imaginez un peu la vie sans système de noms de domaine, on serait obligé de retenir des milliers d’adresses IP (en fait quasiment une par site).

Structure d’un nom de domaine

Un nom de domaine est structuré de manière arborescente, imaginez vous une dynastie d’hermaphrodites (oula les puristes vont me voler dans les plumes avec cette métaphore, normalement on parle d’arbre et de noeuds) dont l’ancêtre unique (le point ‘.’) a plein d’enfants : les TLDs ou top level domains (‘fr’ par exemple) qui eux même ont plein d’enfants : les domaines (‘divioseo’ par exemple) qui ont également plein d’enfants (toujours tout seul hein) : les hôtes (‘blog’ par exemple).

Si on reprend la génèse de mon exemple on obtient ce que l’on appelle un FQDN (Fully Qualified Domain Name) dont l’arrière grand père/mère est le ‘.’ , le grand père/mère est le ‘fr’ , le père/mère est le ‘divioseo’ , le fils/fille est le ‘blog’ , ce qui donne :

blog . divioseo . fr (et oui on cache l’arrière grand père/mère pour d’obscures raison que je ne développerai pas ici, une histoire d’héritage je crois)

Bon si je ne vous ai pas encore perdu définitivement je vais maintenant vous expliquez comment la planète entière arrive a se mettre d’accord sur les milliards de correspondance existantes.

Serveurs de nom et résolution

Les serveurs de nom sont un peu les généalogistes du réseau (oui je continue avec mon exemple à base d’hermaphrodites et de généalogie), ils tiennent à jour les registres qui permettent d’établir la correspondance entre le nom de domaine et l’adresse IP des machines d’un réseau.

Chaque domaine (‘divioseo’ dans l’exemple) possède un serveur de nom primaire et un serveur de nom secondaire qui prendra le relais du serveur primaire en cas de problèmes (si le généalogiste titulaire est malade alors le stagiaire arrète de faire le café et fait le travail).

Chaque serveur de nom se déclare lui même au serveur de nom de niveau supérieur jusqu’a ce qu’on arrive au ‘Top level’, il informe également les serveurs de niveau inférieur qui dépendent de lui des différents changements qui pourraient survenirs dans les registres, cette structure hierarchique permet ainsi de propager des modifications faites à n’importe quel niveau sur tout le réseau. Je ne vais pas rentrer plus dans les détails mais c’est cette structure hierarchique et le cache des serveurs de noms qui sont responsables des « délais de propagation » qui peuvent atteindre jamais parfois 48h.

Quand on achète un nom de domaine le registrar déclare l’enregistrement sur ses propres serveurs dns qui vont informer leurs supérieurs et leurs esclaves, puis miracle de la technologie il est disponible au bout de quelques heures dans votre navigateur.

Il existe plusieurs types d’enregistrements pour les zones DNS, les principaux sont (à mon sens) : A, CNAME, MX, SPF

Je vous expliquerai leur rôles et comment les configurer dans un prochain article, vous allez voir c’est pas si compliqué qu’on veut bien nous le laisser croire :)

Allez courage

Poster votre article sur unblog.fr avec iMacro

iMacro

Pour illustrer mon précédent article voici la macro iMacro pour poster automatiquement sur votre compte unblog.fr (evidemment ca ne crée pas automatiquement un compte sur unblog.fr, il va falloir faire la macro vous même pour cela :p)

SET !ERRORIGNORE YES
VERSION BUILD=6650406 RECORDER=FX
TAB T=1
URL GOTO=http://unblog.fr/wp-login.php
TAG POS=1 TYPE=INPUT:TEXT FORM=NAME:loginform ATTR=ID:user_login CONTENT=MonLogin
SET !ENCRYPTION NO
TAG POS=1 TYPE=INPUT:PASSWORD FORM=NAME:loginform ATTR=ID:user_pass CONTENT=MonPasswd
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:loginform ATTR=ID:submit
TAG POS=1 TYPE=A ATTR=TXT:Ecrireunnouvelarticle
TAG POS=1 TYPE=INPUT:TEXT FORM=NAME:post ATTR=ID:title CONTENT=Montitre
URL GOTO=javascript:void(document.getElementById('mce_editor_0').contentDocument.body.innerHTML="Montextaposter");
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:post ATTR=ID:publish
TAG POS=1 TYPE=A ATTR=TXT:Voirl’article» EXTRACT=HREF
TAG POS=1 TYPE=A ATTR=TXT:Déconnexion

Voila, vous collez ca dans iMacro en remplaçant MonLogin par votre login, MonPasswd par votre mot de passe, Montitre par votre titre et Montextaposter par votre texte a poster :)

Vous remarquerez une subtilité de iMacro : il faut remplacer les espaces par <SP> sinon iMacro va générer une erreur.

Donc si vous avez lu mon précédent post (iMacro et les WYSIWYG) vous voyez qu’ici l’id de l’iframe de l’editeur WYSIWYG est ‘mce_editor_0′ , il faut alors utiliser cette ligne de commande iMacro :

URL GOTO=javascript:void(document.getElementById('mce_editor_0').contentDocument.body.innerHTML="Montextaposter");

Voila c’est dans la boite.

A oui il ya aussi cette ligne qui est importante :

TAG POS=1 TYPE=A ATTR=TXT:Voirl’article» EXTRACT=HREF

La commande EXTRACT=HREF permet de recuperer l’adresse de l’article posté, la il va s’afficher dans une popup mais il est possible de le sauver dans un fichier via la commande SAVEAS … (tout est expliqué sur le wiki de iOpus)

Et vous avez vous des iMacros similaires ?

Edit : unblog a du me lire et a modifié légèrement sa façon de poster, je vous laisse chercher ca reste simple ;)

iMacro et les Rich Text Editor

plugin firefox iMacroIl est possible remplir un rich text editor (tinymce, fckeditor, etc ..) avec le plugin iMacro pour Firefox.

iMacro est un outil qui vous permet d’automatiser à peut près tout sur votre navigateur : remplir un formulaire automatiquement, vous logger puis aller dans une page profonde de votre back office, spammer des dizaines de blogs automatiquement, scrapper un site entier extraire votre carnet d’adresse et vos mails de voila (hein Elcherubin !) …

Si comme moi vous utilisez iMacro de manière assez poussée vous vous êtes surement déja confronté aux limitations du plugin firefox comme l’impossibilité (apparente) de remplir un textarea transformé en rich text editor.

Il y a pourtant 3 solutions pour palier à ce problème :

  1. Acheter la version payante de iMacro :D
    En effet elle intègre un tool que je n’ai pas eu l’occasion de tester mais qui s’avère très puissant : le DirectScreen.
    Il permet de simuler les clics de souris et d’automatiser ainsi tous les contenus non html (flash, ajax, etc …)
  2. Désactiver javascript sur votre navigateur (à l’aide de la webmaster developper toolbar par exemple).
    Ca marche très bien pour remplir les textarea mais du coups ca pose d’autres problèmes.
  3. Utiliser la fonction URL GOTO de iMacro, c’est cette solution que je vais développer

iMacro est capable de lancer des commandes javascript grace a la commande URL GOTO=javascript:du javascript à executer

Quasiment tous les RichTextEditor (tous à ma connaissance) fonctionnent de la même manière : ils créent une iframe qui sert d’editeur WYSIWYG à la suite du textarea.
Il ne reste donc plus qu’a trouver l’id de la frame générée (grace au plugin firebug par exemple) et utiliser javascript pour remplir sa balise body par notre texte :

URL GOTO=javascript:document.getElementById('idframe').contentDocument.body.innerHTML="letexte";

Si la frame n’a pas d’id distinctif on peut alors utiliser cette syntaxe :

URL GOTO=javascript:window.frames[0].document.body.innerHTML="letexte";

Si le Rich Text Editor est basé sur tinyMce alors on peut tout aussi bien utiliser l’api tinymce :

URL GOTO=javascript:tinyMCE.activeEditor.setContent("letext");

Si vous testez la macro a ce stade vous allez vous apercevoir qu’il y a un problème, en effet la commande GOTO:javascript va executer l’action mais en afficher le resultat directement dans la fenetre principale et annuler ainsi tous les benefices de cette astuce.
Il va donc falloir ajouter du javascript supplémentaire à la commande.

J’ai donc logiquement ajouté return; ou bien return false;, et la macro ne charge plus le résultat dans la page mais elle ne le charge pas non plus dans l’iframe argh !

J’ai donc finalement ajouté window.location(); et la la macro fonctionne comme attendu (bizarre hein).

Vous aurez remarqué que la fonction window.location(); n’existe pas en javascript et que cela vas provoquer une erreur javascript, c’est justement ca qui fait que la macro fonctionne comme prévu !

Il faut entourer le code javascript avec void(); pour que ca fonctionne comme attendu. (merci 512banque) :

URL GOTO=javascript:void(window.frames[0].document.body.innerHTML="letexte");

Voila vous allez pouvoir remplir les éditeurs WYSIWYG avec iMacro maintenant, et si vous savez également comment se passer de l’erreur javascript je suis preneur !

Powered by WordPress and Divioseo