SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano

251 Plugins, 182 contribs sur SPIP-Zone, 281 visiteurs en ce moment

Accueil du site > Administration et BDD > Gestion des documents > Hasher les documents > Le plugin hash_documents

Le plugin hash_documents

1er novembre 2009 – par Fil – 10 commentaires

8 votes

Le nombre de documents dans le répertoire IMG/{$ext}/ du site peut devenir beaucoup trop important et avoir un impact sur les performances du système de fichiers du serveur. La solution proposée par ce plugin est de « hasher » le répertoire IMG/.

De manière à limiter le nombre d’inode dans chaque sous-dossier de IMG/, on répartit automatiquement les fichiers dans des sous-sous-répertoires. La structure passe ainsi de
IMG/mp3/fichier-son.mp3
à
IMG/mp3/a/b/c/fichier-son.mp3

Ce plugin s’occupe de tout pour vous.

Une page ecrire/?exec=hash_documents permet d’aller hasher tous les documents déjà installés (mais il n’est pas indispensable de l’utiliser pour que ça fonctionne). On peut à tout moment revenir en arrière (grâce à cette même page).

Dans tous les cas, la désactivation du plugin n’empêche pas le site de fonctionner normalement.

 

Ci-dessous, les explications techniques :

Structure du hashage

le sous-répertoire a/b/c/ doit être calculé de manière à ce que la répartition des documents soit homogène et prévisible. On utilisera pour ce faire une fonction de hashage très simple consistant à prendre les n premiers caractères du md5 du nom du fichier.

md5 ayant une représentation hexa, le nombre de sous-répertoires ainsi créés sera de l’ordre de 16n ; pour répartir correctement un million de documents, on a les possibilités suivantes :

— n=1 16 répertoires * 62500 docs
— n=2 256 rép * 3900 docs
— n=3 4096 rép * 244 docs

Dans cette implémentation, on utilise 3 niveaux de sous-répertoires : pour un fichier d’origine situé dans IMG/{$ext}/xxxx.ext, le hasher consiste à prendre les 3 premiers caractères (a, b, c) du md5(xxxx.ext), et déplacer le fichier dans IMG/$ext/a/b/c/xxxx.ext.

fonction : function hasher_adresser_document(xxxx.ext)

Déplacement d’un document

fonction : function hasher_deplacer_document($id_document) {}

Cette fonction a pour rôle de déplacer un document proprement de sa position non hashée vers sa position hashée. Tous les contrôles d’erreur sont mis en place afin de garantir que tout se passe bien : si la création du sous-répertoire échoue, par exemple, ou si la connexion à la base de données est tombée, il faut pouvoir reprendre.

Elle appelle hasher_adresser_document()

Conversion « batch »

fonction : function hasher_deplacer_n_documents($n) {}

Cette fonction prend les n documents non hashés les plus récents, et appelle hasher_deplacer_document() sur chacun d’eux. Elle renvoie un array() contenant les id_document des documents qu’elle a déplacés.

Elle peut servir à convertir l’existant (on l’appelle répétitivement jusqu’à épuisement du stock), ou juste après un upload (en SPIP 1.9.2, car en SPIP 2 le cas de l’upload est géré nativement via le pipeline ad hoc), ou un spip2spip, afin de hasher les documents qu’on vient d’ajouter [1].

Elle peut aussi être appelée depuis la page ecrire/?exec=hash_documents

Gestion de redirection

Lorsqu’un document a été déplacé, on souhaite qu’un hit sur son ancienne adresse renvoie vers la nouvelle adresse, avec un code HTTP 301 Moved Permanently (redirection définitive).

Ceci permet, d’une part, de gérer proprement la migration ; d’autre part, ça implique qu’il n’est pas indispensable de hasher les documents juste après l’upload, donc beaucoup de souplesse dans l’intégration.

On va pour ce faire ajouter un .htaccess dans le répertoire IMG/ qui lancera, sur les fichiers non trouvés, un script de redirection écrit en PHP ; ce dernier calculera l’adresse hashée du document demandé, vérifiera si ce document est présent, et en fonction du résultat renverra soit un code 301 vers ce document, soit un 404 Not Found.

Le script PHP est le fichier hash_404.php présent dans le plugin ; la seule petite difficulté pour son activation, c’est qu’il nécessite la création d’un .htaccess spécifique dans le répertoire IMG/ contenant le code suivant :

En fonction de la configuration technique de l’hébergeur et de l’emplacement du plugin, il faudra peut-être adapter un peu ce .htaccess.

Compatibilité

Il est important de noter que la structure proposée pour le code offre nativement une grande compatibilité, puisque, une fois les documents hashés, on peut retirer tout le code de hachage sans impact sur le fonctionnement.

On a pris soin de ne pas utiliser de fonctions « fragiles » de SPIP, qui changeraient d’une version à l’autre, afin que ce plugin soit compatible de SPIP 1.9.2 aux SPIP futurs.

La seule difficulté à prendre en compte est que le nommage des documents dans la table spip_documents a changé entre SPIP 1.9.2 et la série SPIP 2.0. En SPIP 1.9.2, en effet, spip_documents.fichier contenait une chaîne de la forme IMG/jpg/postcards.jpg, tandis qu’en SPIP 2 on a simplement jpg/postcards.jpg (le IMG/ a été supprimé).

Le plugin fonctionne nativement avec les deux représentations (avec ou sans IMG/).

Réversibilité

Les fonctions de hashage sont réversibles : un paramètre $rev permet de revenir à la structure « à plat ». Cela permet de revenir en arrière si finalement on ne souhaitait pas utiliser ce système, ou pour en utiliser un autre. Cela a aussi permis de tester le plugin, lors de son développement, en faisant des allers-retours.

Notes

[1] Patch à appliquer aux fonctions qui ajoutent des fichiers dans spip_documents :

Retour en haut de la page

10 Messages de forum

Voir toute la discussion

  • Répondre à ce message

    7 novembre 2009 08:31, par Fil

    On pourrait ajouter une option "classement par date" à ce plugin, toute la mécanique est là.

    Mais quand tu parles de "plusieurs serveurs dédiés", je m’interroge. Est-ce qu’il s’agit de capacité disque ? Dans ce cas, personnellement, je recommanderais plutôt l’utilisation de serveur de type "cloud" (Amazon S3 pour ne pas le nommer). Je serais intéressé à avoir un exemple d’application auquel tu penses.

  • Répondre à ce message

    7 novembre 2009 06:07, par philooo

    oui le classement par date c’est l’ideal pour les gros sites, car en plus ca permet de localilser les documents anciens sur un serveur separe par exemple. avec quelque regle de htaccess, on peut rediriger le visiteur en fonction des dates d’images.

    Quand on a des centaines voir milliers de docs c’est tres vite indispendable d’utiliser plusieur serveurs dedie pour les images.

  • Répondre à ce message

    2 novembre 2009 17:53, par goony

    J’ai de mon côté patché SPIP pour créer des sous-répertoire par date :

    jpg/200901/
    jpg/200902/
    jpg/200903/

    etc...

    Je n’avais pas conaissance de ce plugin, mais dans le passé j’avais fait la même chose que je fais maintenant avec le hash comme le cache (en gros comme ce système mais à un seul niveau).

    Ce système par date n’est pas mal car il nous permet de regrouper plus ou moins les documents par articles (à moins qu’on upload des documents sur une très longue période), et ca peut aider à situer leur date d’upload, les articles correspondants, et retrouver les documents plus vite et intuitivement sur le disque.

    Si ca peut donner des idées...

    Benoit

  • Répondre à ce message

    2 novembre 2009 12:51, par Nicolas Hoizey

    Via Subversion, oui.

  • Répondre à ce message

    2 novembre 2009 12:17, par Manu_TJ

    Comment avez vous fait pour récupérer le plugin ? Il faut obligatoirement utiliser svn ?
    Je ne le trouve pas ici : http://files.spip.org/spip-zone/
    Merci par avance pour votre aide.

  • Répondre à ce message

    2 novembre 2009 11:06, par Nicolas Hoizey

    Oui, je sais bien que les logos posent problème, avec leur stockage direct à la racine. Les passer en gestion comme des docs à part entière est sans doute nécessaire, et hash_documents pourra alors les prendre en charge... ;-)

  • Répondre à ce message

    2 novembre 2009 11:04, par Fil

    Hasher les logos n’est pas prévu, mais sens-toi libre de le coder en option. En option seulement, car la caractéristique du plugin actuel est qu’on le désactive quand on veut sans perdre aucune fonctionnalité. Pour les logos c’est impossible en l’état actuel de SPIP.

  • Répondre à ce message

    2 novembre 2009 10:57, par Nicolas Hoizey

    Ah, au fait, tant qu’on y est, serait-il envisageable de hasher aussi les logos, j’en ai beaucoup, puisque j’ai beaucoup de rubriques et articles...

  • Répondre à ce message

    2 novembre 2009 10:56, par Nicolas Hoizey

    Excellente nouveauté pour les sites avec beaucoup de docs !

    Je viens de le mettre en place sur un site SPIP 2, et il n’arrive pas à hasher 90 document sur les un peu plus de 3000 que j’ai. Tous ces 90 semblent avoir un nom comportant au moins un chiffre...

  • Répondre à ce message

    2 novembre 2009 10:31, par Manu_TJ

    Bonjour

    je voudrais tester ce plugin mais je ne trouve pas l’endroit où le télécharger. Suis-je mal réveillé ?

    Manu

Répondre à cet article

Retour en haut de la page

Ça discute par ici

  • Le jeu de squelettes GLOBENEWS

    12 août 2009 – 17 commentaires

    Installation Télécharger le fichier ci-dessous et décompressez-le dans le répertoire "plugins" placé à la racine de votre site. Pour l’installer, aidez-vous de ce lien. Présentation Ce plugin permet d’utiliser le jeu de squelettes GLOBENEWS et de (...)

  • CleverMail

    20 janvier – 48 commentaires

    CleverMail est un plugin permettant d’envoyer des lettres d’informations à des abonnés depuis SPIP. Issu au départ d’un développement libre complètement indépendant de SPIP, il a connu une première version pour SPIP 1.9 avant d’être complètement réécris (...)

  • Découper un texte en pages et/ou en onglets

    4 mai 2007 – 188 commentaires

    Un raccourcis typographique qui découpe le texte de vos rubriques ou de vos articles en plusieurs pages, ou crée pour vous des onglets... Rubis sur ongle ! Introduction Les articles de votre site sont parfois un peu longs et vous vous êtes (...)

  • Le plugin FreepapeR 2 v0.9.0

    10 mars – commentaires

    Un outil pour visualiser en ligne les fichiers PDF. Cette nouvelle version intègre une présentation "Livre". L’outil est installé sur son propre serveur, pour des documents toujours disponibles et jamais altérés... Il n’y a aucune dépendance envers (...)

  • Formulaire de contact avancé

    23 mars 2009 – 505 commentaires

    Cette extension propose un formulaire de contact avec de multiples options.