nyroBlog
Bannière NyroBlog, par Nyro
Image par Nyro - ?

Tag : PHP


PHP : un système de cache très simple et efficace

Lorsqu'on doit lister des éléments provenant d'une base de données avec énormément de liaisons dans la requête, le traitement prend quelques secondes et le serveur en prend un coup à chaque affichage de page.

Pour palier à ça, il faut mettre en place un système de cache des pages de listing.

Un système de cache consiste en l'enregistrement de la page une fois totalement traitée (donc ce qu'on affiche, le code HTML final) puis à le ressortir lors de l'appel suivant de la même page. Bien sûr, dans tout bon système de cache, on peut spécifier la durée de vie de ce cache (1 heure par exemple) pour qu'il soit effacé au delà et remplacé par un nouveau.

Avec ceci, on gagne donc en ressource serveur (beaucoup moins de connexions vers le serveur MySQL) mais les pages affichées ne sont pas synchronisées à l'instant T, on a 1 heure maximum de décalage. Même si ce n'est pas énorme, ce peut être handicapant dans certains cas, il faut le garder à l'esprit.

Pour un site que j'ai mis en ligne samedi dernier, qui utilise jusqu'à 11 tables dans ses listings, j'ai dû mettre en place un tel système pour gagner en temps d'affichage. L'avantage est que les listings changent une ou deux fois par jour au grand maximum, pas du tout pour la plupart. Le temps du cache est donc pour l'instant d'une heure, mais il est possible que je le monte à 2 voir 3 heures.

Pour mettre en place un tel système, j'ai regardé s'il n'existait pas un bout de code ou une classe sous licence GPL prête à l'emploi. Après quelques googlisations, j'ai trouvé mon bonheur.

Un petit tour dans le code pour changer le dossier d'enregistrement du cache afin de le rendre inaccessible depuis le site, et pour voir comment il générait ses noms de cache.

Il utilise simplement l'URL de la page demandée, y ajoute tous les paramètres donnés en GET et en fait le MD5 (pour avoir toujours la même longueur de nom fichier et pas de problèmes avec des caractères spéciaux) et y donne l'extension .cache.

Le gros plus de cette classe, c'est qu'elle permet de mettre en cache la page PHP zone par zone. On peut ainsi imaginer une page avec une partie sans cache (le menu avec les infos de connexion par exemple), une partie avec un cache d'une heure (un listing qui change assez souvent) et une partie avec un cache d'une journée (un classement journalier par exemple).

De plus, si vous voulez forcer la reconstruction du cache, il suffit de mettre le paramètre rebuild en GET dans l'URL de la page.

Une classe à ajouter à votre librairie de toute urgence ! (et le site dans vos favoris...)


Modification de décembre 2010

Comme le fichier n'est plus accessible depuis le lien donné plus haut, voici le fichier que j'avais gardé dans mes archives.

PHP/MySQL : Mettre en place des catégories sur différents niveaux

On a toujours besoin de trier ses produits, articles, billet ou autres dans des catégories.

Si on en a beaucoup, on veut pouvoir d?finir plusieurs niveaux de catégories.

Je vais vous montrer ici comment on peut simplement gérer différents niveaux de catégories. Par exemple, on peut avoir :

Auto-Moto
Auto
Berline
4x4
Coupé
Moto
125
250
Immobilier
Location
Achat

On voit ici qu'on peut aller jusqu'à 3 niveaux de profondeur (Berline ou 125 par exemple) mais qu'on a aussi des catégories au 2ème niveau (Location). Avec un nombre fixe de niveaux, c'est assez simple : une table MySQL pour chaque niveau, avec chacun un identifiant vers sa catégorie mère et le tour est joué. Là, nous allons devoir faire autrement.

1) La table MySQL
Pour commencer, voici la structure de la table MySQL que j'utilise :

CREATE TABLE cat (
id_cat int not null auto_increment primary key,
rid_cat int default '0',
nom varchar(50) not null
);

id_cat : identifiant unique de la catégorie.
rid_cat : clé étrangère, qui fait référence à la catégorie mère, s'il y en a une.
nom : le nom de la catégorie.

Avec cette table, n'importe quel élément qui doit être rattaché à une catégorie le sera avec son id_cat, indifférement de son niveau, puisque toutes les catégories sont stockées dans cette même table.

Maintenant que la façon de stockée ces catégories est en place, voyons comment tirer parti de cette structure

2) La récupération des catégories mères
Pour la navigation, il est toujours agréable de mettre en place en haut de la page le cheminement des catégories depuis l'accueil.
Par exemple Accueil > Auto-Moto > Auto quand on se trouve sur la page des autos, avec un lien sur chaque intitulé pour revenir sur la page concernée.

Pour récupérer toutes les catégories mères d'une catégorie donnée, nous allons utiliser une fonction récursive. Les mathophobes, rester avec nous, il n'y a pas de grands rapports avec les suites ou séries mathématiques que vous connaissez. Le rapport vient du fait que cette fonction va faire des appels à elle-même pour avancer dans la hiérarchie. Voici cette fonction PHP :

function recupMere($idCat) {
$data = mysql_fetch_array(mysql_query("SELECT id_cat,rid_cat,nom FROM cat WHERE id_cat='$idCat'"));
$ret = '';
if (!empty($data['rid_cat'])) $ret = recupMere($data['rid_cat']).' > ';
$ret.= $data['nom'];
return $ret;
}

En fait, on continue la recherche de la mère tant que rid_cat n'est pas vide. A chaque nouvelle catégorie rencontrée, on concatène avec > comme séparateur pour arriver au résultat escompté.

3) La récupération des catégories filles
Pour la première fonction, la simplicité venait du fait qu'une catégorie a 0 ou 1 catégorie mère, ce qui permet de créer la chaine simplement. Pour récupérer les filles, c'est un peu plus compliqué selon ce qu'on veut en faire. Voici par exemple une fonction permettant de créer une liste déroulante avec toutes les sous-catégories de la catégorie demandée :

function selFilles($idCat=0, $mere='') {
$ret = '';
$req = mysql_query("SELECT id_cat,nom FROM cat WHERE rid_cat='$idCat'");
while ($row = mysql_fetch_array($req)) {
$ret.= ''."\n";
$ret.= selFilles($row['id_cat'],$mere.$row['nom'].' > ');
}
return $ret;
}
Le premier paramètre sert à spécifier la catégories à partir de laquelle on veut afficher les sous-catégories. Par défaut il vaut 0, ce qui veut dire qu'on afficherait toutes les catégories de la base. Avec notre exemple, on obtiendrai ceci :
Le second paramètre est utilisé pour conserver le chemin parcourut jusque là. On aurait pu aussi rappeler la première fonction, mais on économise ainsi des requêtes MySQL, autant ne pas s'en priver !

Bien sûr, on peut imaginer des autres applications, pour sortir les catégories dans un fichier XML pour une utilisation dans Flash par exemple.

Vous pouvez télécharger les sources, avec quelques exemples et la base de donnée utilisée dans l'exemple.

Si vous avez d'autres idées ou suggestions pour cet article, n'hésitez pas, les commentaires sont là pour ça.

Sortie du [Frigo] N°4

[Frigo] N?4Le [Frigo] N°4 vient de sortir.


Au programme :
Devenir infographiste : un maître mot, l'imagination !
Cet été, détendez-vous : cinéma, musique, jeux vidéo
Mathieu Collé : Cap sur les gobelins
Télévision HD : Le futur est déjà là
Les Flux RSS (le petit article dont je vous avais parlé)
Et plein d'autres choses...

Bonne lecture






Google Gears

La grosse info du jour, c'est Google qui sort une beta de Gears.

Gears est un plugin (pour IE, FireFox e bientôt Safari) qui permet eu développeur de mettre en place facilement une application web fonctionnant offline. Le plugin se comporte comme un base dedonnée locale par laquelle toutes les requêtes vers le serveur passe. Si le serveur n'est plus disponible (déconnecté), alors le plugin enregistre toutes les requêtes effectuées.
A la prochaine connexion, les requêtes seront envoyées dans l'ordre au serveur pour être mise à jour.
En plus de sauvegarder les requêtes, il sauvegarde les CSS, l'HTML, et les javascript; bref, tout ce dont a besoin l'appli pour fonctionner.

Gears est open source, et laisse présager beaucoup de bon pour l'avenir. Je vais m'y intéresser cet été; imaginez, vous proposez à vos clients vagabonds une administration disponible off-line. Le rêve.

La présentation au Google Developper Day 2007 (anglais) :

Reste à choisir entre celui là ou alors attendre FireFox 3 qui permettra de faire aussi des choses du genre. A choisir, ça sera plus Gears car il est disponible avec IE, donc moins contraignant.
Votre avis ?

Via Fred Cavazaa

WikiJournal est en ligne

Wiki JournalSur certains projets, on s'investit tellement qu'on a envie qu'ils marchent.
Bien sûr, on passe par des phases de doutes, on ne sait pas trop si ça va marcher, on ne sait plus. Mais on fait quand même.

Ce projet est une commande de La Communication Directe, qui m'a trouvé sur google au mois de décembre dernier. Il m'a fourni un cahier des charges que j'ai lu et annoté pendant un week-end à Lyon. Retour sur Besançon pour lui faire un devis. J'étais en concurrence avec 2 autres entreprises (pas des freelance) : j'étais plus cher et plus long. J'ai eu le contrat car j'avais donné la sensation de maîtriser plus ses attentes que les autres. En effet, je travaillais déjà (et je travaille toujours) sur la refonte d'un site du même genre.

Parlons un peu du projet à proprement parlé : WikiJournal est un site national désireux d'être proche de vous. Pour cela, tous les contenus sont localisés par régions, départements et 'pays'; on peut consulter le site au niveau national ou bien au niveau de chaque région. C'est la vision du client. Dans ce journal, on y trouve des articles présentant les régions, ce qu'on peut y faire, etc... Il y a aussi des petites annonces gratuites pour vendre ou acheter ce que vous voulez, un agenda local pur annoncer vos manifestations ou trouver de quoi faire ce week-end et un annuaire professionnel pour trouver votre plombier.

Dans chaque partie, vous pouvez soit consulter les ajouts effectués par les utilisateurs par catégories et/ou par localisations, mais aussi en ajouter par des formulaires qui sont à la fois simples, concis et faciles d'utilisation. Tous les ajouts et modifications doivent être validés pour apparaître sur le site.
Pour ce faire, le client dispose d'une administration protégée, dont j'ai fait le graphisme depuis un design récupéré sur OSW. Voici le résultat :
Administration WikiJournal
Ici pour les petites annonces. Evidemment, il n'y en a pas beaucoup, le site vient tout juste d'être lancé.
Comme à mon habitude, j'utilise TinyMCE (que j'affectionne particulièrement) dans l'administration pour gérer des pages fixes du site, ou le contenu des articles.

Il y a beaucoup d'Ajax dans le site. Par exemple, pour recharger les liste déroulantes lorsqu'on sélectionne une nouvelle localisation. Ce n'est pas la première fois que j'en fait, mais c'est le premier projet où il y en a autant.

Un gros travail a été fait pour optimiser le référencement. Si vous regarder les URLS des pages de résultats, vous verrez par exemple ceci :
http://www.wikijournal.fr/articles,r11,Midi_Pyrenees.html
http://www.wikijournal.fr/articles,r16,Provence_Alpes_Cote_d_Azur.html
On ne sait pas encore trop ce que va donner cet URL Rewriting, mais c'est toujours plus beau que des paramétres passé en GET. Bien sûr, un travail similaire a été fait sur les titres des pages, qui reprennent à peu près le même principe.

De plus, tous les formulaires d'ajout de données (ou de contact) utilise un captcha fait maison pour éviter tout pourrisage par des robots malveillant. En voici un exemple :
Captcha

Et où gagne-t-il de l'argent ?
Il mise tout sur 2 choses :

  • Les Google Ads qui sont présentes un peu partout, plus ou moins dominantes. Personnelement, je les trouve pas vraiment envahissante.
  • Les bandeaux publicitaires, qu'il n'est pas encore possible d'acheter; ce sera possible un peu plus tard, quand le site aura grandi. Lorsqu'on achète un bandeau, la personne désirant affichée sa pub pourra sélectionné la partie du site, la catégorie de la partie, mais aussi la localisation où il veut afficher sa pub. Ainsi, il peut cibler ces affichages et avoir un retour sur les clics plus intéressants

J'ai aussi mis en place PhpMyVisites pour qu'il puisse suivre ses visite au jour le jour. Il commence déjà à regarder quelles recherches tapent les visiteurs qui arrivent son site, et à le paramétrer pour ne pas se prendre en compte dans les stats. Cet outil est vraiment adaptéà n'importe qui !