skip to main | skip to sidebar
Code 18
Manuel du savoir-faire à l'usage des geeks et des curieux
RSS
  • Accueil
  • Le web au Québec
  • Liens
  • Twitter
  • Facebook
  • À propos

samedi 16 février 2013

Drupal 7 : mécanique interne de la maintenance

Publié par Infinite Loop, à 15 h 16 1 commentaire

Une fois la première installation de base de Drupal complétée, je suis allé voir du côté de la configuration pour prendre connaissance des options offertes. Comme je n'ai pas d'expérience avec ce CMS, il existe un risque que je veuille modifier quelque chose et que ça tourne à la catastrophe, principalement si j'ai la mauvaise idée de le faire directement sur l'environnement de production. Dans ce cas, mieux vaut rendre le site temporairement indisponible en le mettant en maintenance.

Pour basculer en mode maintenance, il suffit de se connecter en administrateur à partir du bloc d'identification situé sur la page d'accueil, puis de se rendre par le menu d'administration à Configuration / Development / Maintenance Mode puis de cocher la case "Put site into maintenance mode" et de personnaliser le message qui apparaîtra sur le site jusqu'à ce qu'il redevienne disponible une fois les correctifs appliqués.


Pour tester, j'ai mis le site offline et je me suis déconnecté. Le problème, c'est qu'il n'y avait plus moyen de retourner au formulaire pour remettre le site online puisque le formulaire d'authentification avait disparu. Si j'avais lu le commentaire sous la case à cocher, j'aurais su qu'il est possible d'accéder directement à l'URL à locahost/code18/user durant la maintenance pour pouvoir se reconnecter en tant qu'administrateur pour changer la configuration à nouveau.

La partie technique qui intéressera les programmeurs

Entre temps, pour trouver le moyen de retirer la maintenance, j'ai fouillé sous le capot de Drupal, ce qui m'a permis de mieux comprendre une partie de son fonctionnement interne. Je soupçonnais fortement qu'un flag ou un champ booléen soit stocké dans la base de données et je devais simplement trouver où.

J'ai commencé par faire une recherche dans le code source pour le terme "maintenance" et j'ai revu le fonctionnement comme en reverse engineering :
  • J'ai trouvé plusieurs instructions du type variable_set('maintenance_mode', TRUE), ce qui indique qu'on peut mettre le site en maintenance, par programmation.
  • Sachant l'URL de la page de configuration (admin/config/development/maintenance), j'ai trouvé que la route qui mène à cette section est définie dans un array nommé $items situé dans le fichier system.module (situé dans modules/system à la racine de Drupal). Chaque définition de module est faite à l'aide d'un fichier .info situé dans le répertoire du module, auquel correspond un fichier .module qui contient l'implémentation en PHP.
  • Lorsqu'on accède à cette URL, Drupal invoque la fonction system_site_maintenance_mode() qui se trouve dans system.admin.inc.
  • La fonction system_site_maintenance_mode() utilise un array nommé $form pour définir par programmation les champs du formulaire à afficher, comme si on le faisait dans un contrôleur MVC.
  • Dans ce formulaire, l'appel à variable_get('maintenance_mode', 0) sert à obtenir la valeur par défaut de la variable nommée maintenance_mode. Si elle n'existe pas, la valeur par défaut sera 0.
  • variable_get() et variable_set() sont définies dans bootstrap.inc qui contient plusieurs fonctions utiles qui me font penser aux helpers dans Codeigniter.
  • La fonction variable_set() utilise à l'interne db_merge() pour stocker dans la table "variable" les différentes clés/valeurs. Chaque fois que variable_set() est appelée, un appel interne à cache_clear_all() se fait pour réinitialiser la mémoire cache de Drupal. Lorsque j'examinais les options du menu Configuration, j'ai vu qu'il est possible de forcer cette manoeuvre par l'interface en cliquant sur le bouton "Clear all caches" situé sous Configuration / Development / Performance.
  • Finalement, system_settings_form() appelle system_settings_form_submit() où s'opère l'enregistrement dans la base de données à l'aide de variable_set().
Maintenant que je savais que le flag était stocké dans la table "variable" sous la clé "maintenance_mode" (tirée de $form['maintenance_mode']), je suis allé jeter un oeil aux données, pour découvrir qu'elle ne s'y trouvait pas. Du moins pas encore. C'est qu'elle n'est pas créée par défaut et que l'enregistrement sera ajouté lors de la première utilisation de l'option de maintenance. Lorsque c'est fait, les entrées "maintenance_mode" et "maintenance_mode_message" s'ajoutent à la table variable.

Dans le mode Grid View de Navicat pour MySQL, on peut voir que les valeurs de la table variable sont stockées en tant que type blob (binary large object). Il suffit de basculer en mode "Memo" pour faire apparaître la valeur : "i:1;", où 1 équivaut à une maintenance activée et 0 à un fonctionnement normal. Comme on l'a vu plus haut, si on change la valeur directement dans la base de données, il ne faut pas oublier de réinitialiser la cache pour simuler le mécanisme interne de variable_set() afin que le changement prenne effet. Allez-y par le bouton"Clear all caches" si c'est nécessaire.


Tags: Drupal

1 réponse à "Drupal 7 : mécanique interne de la maintenance"

  1. Anonyme a dit...
    21 février 2013 à 06 h 31

    Bonjour,

    très bel article.


Publier un commentaire

Message plus récent Messages plus anciens Accueil
S'abonner à : Publier des commentaires (Atom)
    Suivre @code18 sur Twitter

    Catégories

    • Apache (21)
    • Citations (167)
    • Club Vidéo (24)
    • Coffre à outils (56)
    • CSS (8)
    • Curiosités (117)
    • Design Pattern (2)
    • Drupal (8)
    • Easter Eggs (22)
    • Extensions Firefox (20)
    • GIMP (7)
    • Histoire (21)
    • HTML (32)
    • Humour (57)
    • Intégration (34)
    • iPod (12)
    • JavaScript (110)
    • Jeu de combat (6)
    • Le coin du geek (128)
    • Liens (12)
    • Linux (56)
    • Livres (78)
    • Lois et principes (46)
    • Marché des saveurs (26)
    • Mathématique (18)
    • Mobile (5)
    • Montréal (32)
    • Musique (112)
    • Pancartes et écriteaux (16)
    • Perl (8)
    • Pérou (1)
    • PHP (130)
    • PostgreSQL (44)
    • Programmation (105)
    • Saviez-vous que (55)
    • Sécurité (22)
    • SEO (5)
    • SQL Server (22)
    • Vieilles publicités (6)
    • Virtualisation (8)
    • Voyages (1)
    • Zend Framework (26)

    Divers

    Archives

    • ►  2015 (6)
      • ►  août 2015 (1)
      • ►  juillet 2015 (1)
      • ►  février 2015 (3)
      • ►  janvier 2015 (1)
    • ►  2014 (8)
      • ►  décembre 2014 (1)
      • ►  novembre 2014 (1)
      • ►  octobre 2014 (1)
      • ►  août 2014 (2)
      • ►  juillet 2014 (2)
      • ►  janvier 2014 (1)
    • ▼  2013 (53)
      • ►  décembre 2013 (2)
      • ►  novembre 2013 (1)
      • ►  octobre 2013 (3)
      • ►  septembre 2013 (2)
      • ►  août 2013 (5)
      • ►  juillet 2013 (3)
      • ►  juin 2013 (5)
      • ►  mai 2013 (3)
      • ►  avril 2013 (7)
      • ►  mars 2013 (7)
      • ▼  février 2013 (11)
        • Ajouter une liste pré-construite d'options dans un...
        • Anatomie de base d'un module Drupal 7
        • Deux modules Drupal pratiques pour l'interface d'a...
        • Initier un nouvel employé
        • Drupal 7 : mécanique interne de la maintenance
        • Citation no. 159 sur la politesse
        • Installation Drupal et XAMPP
        • Drupal pour débutants
        • Calicem capulus
        • La méthode Google : que ferait Google à votre place ?
        • Les craintes de mon patron suite à ma démission
      • ►  janvier 2013 (4)
    • ►  2012 (105)
      • ►  décembre 2012 (8)
      • ►  novembre 2012 (5)
      • ►  octobre 2012 (4)
      • ►  septembre 2012 (1)
      • ►  août 2012 (8)
      • ►  juillet 2012 (7)
      • ►  juin 2012 (7)
      • ►  mai 2012 (10)
      • ►  avril 2012 (13)
      • ►  mars 2012 (15)
      • ►  février 2012 (15)
      • ►  janvier 2012 (12)
    • ►  2011 (146)
      • ►  décembre 2011 (14)
      • ►  novembre 2011 (11)
      • ►  octobre 2011 (12)
      • ►  septembre 2011 (13)
      • ►  août 2011 (15)
      • ►  juillet 2011 (17)
      • ►  juin 2011 (18)
      • ►  mai 2011 (15)
      • ►  avril 2011 (9)
      • ►  mars 2011 (7)
      • ►  février 2011 (3)
      • ►  janvier 2011 (12)
    • ►  2010 (398)
      • ►  décembre 2010 (29)
      • ►  novembre 2010 (28)
      • ►  octobre 2010 (32)
      • ►  septembre 2010 (34)
      • ►  août 2010 (22)
      • ►  juillet 2010 (35)
      • ►  juin 2010 (42)
      • ►  mai 2010 (36)
      • ►  avril 2010 (37)
      • ►  mars 2010 (34)
      • ►  février 2010 (32)
      • ►  janvier 2010 (37)
    • ►  2009 (430)
      • ►  décembre 2009 (32)
      • ►  novembre 2009 (34)
      • ►  octobre 2009 (33)
      • ►  septembre 2009 (37)
      • ►  août 2009 (37)
      • ►  juillet 2009 (39)
      • ►  juin 2009 (38)
      • ►  mai 2009 (37)
      • ►  avril 2009 (35)
      • ►  mars 2009 (37)
      • ►  février 2009 (32)
      • ►  janvier 2009 (39)
    • ►  2008 (84)
      • ►  décembre 2008 (34)
      • ►  novembre 2008 (39)
      • ►  octobre 2008 (11)

    Abonnés

Copyright © All Rights Reserved. Code 18 | Converted into Blogger Templates by Theme Craft