Démarche d’amélioration des performances Drupal

Améliorer les performances d’un site (Drupal ou non) peu se révéler être une tâche complexe puisque, par définition, tous les niveaux d’architecture matérielle et logicielle sont potentiellement concernés (Apache, PHP, MySQL, infrastructure)

Une démarche rigoureuse et méthodique est impérative afin de ne pas se lancer dans des optimisations en aveugle. En voici les principales étapes :

Constater, Reproduire, Diagnostiquer, Prioriser, Corriger, Mesurer, Itérer

Pour chaque étape nous mentionnons certains outils classiquement utilisés, sans être exhaustif. Chacun d’entre eux mériterait un développement à part.…

Read more

behat & drupal 8 : exemple complet et simple

Addendum : behat sera entièrement installé dans drupal 8.3 (5 avril 2017)

Une fois drupal et le composer installés correctement, dans /var/www/d8 avec un compte admin/admin

Le tuto officiel n’est pas vraiment complet/utilisatble tel quel (le behat.yml par défaut n’est pas complet).

Pour installer, j’utilises le composer installé globalement :

composer require drupal/drupal-extension='~3.0'

Ensuite behat est rajouté automatiquement dans « vendor » ou il y avait déjà un répertoire behat, mais pas complet.

vendor/behat/behat/bin/behat --init

Maintenant on créer le behat.yml minimaliste pour pouvoir lancer les tests :

default:
  suites:
    default:
      contexts:
        - Drupal\DrupalExtension\Context\DrupalContext
        - Drupal\DrupalExtension\Context\MinkContext
  extensions:
    Behat\MinkExtension:
      goutte: ~
      base_url: http://localhost/d8
    Drupal\DrupalExtension:
      api_driver: "drupal"
      blackbox: ~
      drupal:
        drupal_root: "/var/www/d8"

Premier test basique dans features/navigate.feature

  Everything from the site.
Read more

Liste des librairies de Drupal8 (répertoire vendor)

  • asm89/stack-cors : Cross-origin resource sharing library and stack middleware.
  • behat : Behat is an open source Behavior Driven Development framework for PHP 5.3+.
  • composer : Dependency Manager for PHP.
  • doctrine : The Doctrine Project is the home to several PHP libraries primarily focused on database storage and object mapping.
  • easyrdf : A PHP library designed to make it easy to consume and produce RDF.
  • egulias/email-validator : EmailValidator – PHP Email validator library inspired in @dominicsayers isemail
  • fabpot/goutte : Goutte is a screen scraping and web crawling library for PHP.
Read more

Import d’un site existant dans aegir depuis un dépôt git

Petit préambule pour bien comprendre le vocabulaire d’aegir.

Imaginons que vous ayez un site sur monurl.fr qui pointe sur /var/www/monsite (la plateforme) dans votre vhost avec un sous-répertoire /sites/monurl.fr (le site), le tout géré par votre dépôt git sous gitlab.

Pour faire simple aegir appelle un drupal sans base de donnée une plateforme et un drupal avec sa base de donné un site :

  • une plateforme au sens aegir, c’est le dépôt git d’un répetoire drupal avec sa branche courante (qu’on ne peut plus changer à postériori)
  • une site au sens aegir c’est : à l’intérieur d’une plateforme, un répertoire dans sites avec le settings.php (généré par aegir, il ne faut pas y toucher), une base de donnée, un alias, et un vhost

Etape 1 : créer la plateforme à partir du dépôt git

Une plateforme, c’est un répertoire PHP avec un drupal installé dedans, mais sans base de donnée associée (une plateforme peut contenir plusieurs sites).…

Read more

Installation d’aegir pour gérer un parc de sites Drupal

aegir est un outil web qui permet de piloter un parc de sites Drupal. Ce qu’on fait en général via des commandes drush (drush updb, drush fra, etc…) on peut le faire via un site web directement. C’est un site Drupal, qui pilote la gestion d’autres sites Drupal. Bien sûr, on pourrait faire tout ça et même plus via des scripts ou quelques outils de supervision.

L’intérêt c’est de donner à l’utilisateur (le client) la possibilité de créer des sites à la volé par exemple, ou de lancer des opérations sur plusieurs sites à la fois, sans « mettre les mains dans le cambouis ».…

Read more

Retex : sécurisation Drupal

Je me suis fait hacker sur l’un de mes sites Drupal en production, sur le serveur qui était mal protégé.

L’alerte

Tout commence par OVH qui bloque l’envoies d’email parce que le serveur est repéré comme spammeur :

Bonjour,

Notre protection Anti-Spam a détecté un envoi important de spam à partir d'une de vos IP: 
92.XX.XX.XXX

Afin d'assurer la sécurité de notre réseau le trafic sortant de votre serveur vers les
ports 25 a été suspendu.

Afin que vous puissiez effectuer les vérifications voici un échantillon des emails bloqués:

Destination IP: 217.69.139.150 - Message-ID: <span id="OBJ_PREFIX_DWT169_com_zimbra_email" class="Object"><span id="OBJ_PREFIX_DWT170_com_zimbra_email" class="Object">20160325090323.E07981XXXXX@vpsXXXXX.ovh.net</span></span> - Spam score: 9999
Destination IP: 66.102.1.27 - Message-ID: <span id="OBJ_PREFIX_DWT171_com_zimbra_email" class="Object"><span id="OBJ_PREFIX_DWT172_com_zimbra_email" class="Object">20160325090402.E91EE1XXXXX@vpsXXXXX.ovh.net</span></span> - Spam score: 9999
Destination IP: 194.186.47.93 - Message-ID: <span id="OBJ_PREFIX_DWT173_com_zimbra_email" class="Object"><span id="OBJ_PREFIX_DWT174_com_zimbra_email" class="Object">20160325090343.81C801XXXXX@vpsXXXXX.ovh.net</span></span> - Spam score: 9999
Destination IP: 94.100.180.150 - Message-ID: <span id="OBJ_PREFIX_DWT175_com_zimbra_email" class="Object"><span id="OBJ_PREFIX_DWT176_com_zimbra_email" class="Object">20160325090422.973121XXXXX@vpsXXXXX.ovh.net</span></span> - Spam score: 9999
Destination IP: 94.100.180.150 - Message-ID: <span id="OBJ_PREFIX_DWT177_com_zimbra_email" class="Object"><span id="OBJ_PREFIX_DWT178_com_zimbra_email" class="Object">20160325090441.E3F061XXXXX@vpsXXXXX.ovh.net</span></span> - Spam score: 9999

Merci de consulter attentivement ce guide:

    <span id="OBJ_PREFIX_DWT179_com_zimbra_url" class="Object"><span id="OBJ_PREFIX_DWT180_com_zimbra_url" class="Object"><a href="http://guide.ovh.net/AntiSpamBestPratice" target="_blank">http://guide.ovh.net/AntiSpamBestPratice</a></span></span>

Si vous avez identifié et résolu la cause du blocage, vous pouvez débloquer votre IP
depuis le manager, en vous rendant à cette adresse :

    <span id="OBJ_PREFIX_DWT181_com_zimbra_url" class="Object"><span id="OBJ_PREFIX_DWT182_com_zimbra_url" class="Object"><a href="https://www.ovh.com/manager/#/configuration/ip?action=antispam&amp;ip=92.XX.XX.XX&amp;ipSpamming=92.XX.XX.XX" target="_blank">https://www.ovh.com/manager/#/configuration/ip?action=antispam&amp;ip=92.XX.XX.XX&amp;ipSpamming=92.XX.XX.XX</a></span></span>

C’est une IP Russe qui envoies des emails (probablement du SPAM) vers les Chinois.…

Read more

Améliorer Behat pour Drupal avec 3 extensions : screenshot, code coverage, et watchdog

Behat est très puissant pour faire des tests de non regression. Comment le rendre encore plus puissant, avec 3 petites extensions très pratiques pour le debug :

  1. En affichant les warning rajoutés dans le watchdog automatiquement à la fin d’un test. Très pratique pour s’assurer qu’il n’y a pas d’erreur cachées pendant l’exécution des tests
  2. En rajoutant un test de couverture du code avec xdebug et phpcov pour voir si tout est bien testé
  3. En prenant un screenshot automatique de l’étape behat si elle plante, afin de pouvoir voir ou est le problème sans avoir passer par un « Then I break »

Rajouter un display du watchdog à la fin d’un scénario

dans le composer.json de votre répertoire behat (il faut avoir installé composer avant bien sûr)

{
  "require": {
    "drupal/drupal-extension": "~3.0",
    "jorgegc/behat-drupal-extension": "*"
}

dans le shell on fait la mise à jour :

composer update

On rajoute le contexte dans behat.yml

default:
  suites:
    default:
      contexts:
        - JGC\Behat\DrupalExtension\Context\WatchdogContext

Et voila, c’est tout.…

Read more

memo YAML

Respecte l’indentation (uniquement via les espaces)

  • avec [ pour les listes
  • : avec { pour les mappings (enregistrements / tableau associatifs)

Pour le multi-ligne c’est un peu compliqué (_ veut dire espace):

  • | et > démarre à la ligne suivante, garde les espaces à la fin
    • | considère les sauts de ligne comme des sauts de ligne et pas des espaces
  • _ et et «  sur la même ligne, élimine les espaces à la fin
    • «  échappe les \n et \ et « 
    • _ si la chaîne ne contient pas # ou :
Scalars
# scalar = value
a: 1
a: 1.234
b: 'abc'
b: "abc"
b: abc
c: false	# boolean type
d: 2015-04-05	# date type

# Enforcing strings
b: !str 2015-04-05
Sequences
# sequence
array:
- 132
- 2.434
- 'abc'

# sqeuence of sequences
my_array:
- [1, 2, 3]
- [4, 5, 6]
Hashes
# Nest hash
my_hash:
  subkey:
    subsubkey1: 5
    subsubkey2: 6
  another:
    somethingelse: 'Important!'

# Hash of hashes
my_hash: {nr1: 5, nr2: 6}
Newlines
# block notation (newlines become spaces)
content:
  Arbitrary free text
  over multiple lines stopping
  after indentation changes...
Read more

Les plugins de Drupal 8, kaçaçéksa ?

En Drupal 7, tout démarre avec le hooks. Ce temps de simplicité se termine avec Drupal 8, on a maintenant 6 mécanismes d’extension (hooks, plugins, entities, services, routing, events). Les plugins sont les petits nouveaux de l’API drupal 8, ils remplacent certains hooks, mais pas tous. On y est très vite confronté puisque pour créer un block, on passe par un plugin (Drupal\Core\Block\BlockBase). Mais pas pour créer un menu menu (hook_menu qui n’existe plus en Drupal 8) ni modifier une formulaire (hook_form_alter, qui existe toujours en D8).…

Read more

Amoureux de Behat

Je viens de passer une semaine à coder des tests behat pour un projet Drupal !

J’en suis tombé amoureux. C’est vraiment l’outil qui manquait pour rédiger des tests : les simpleTest et compagnie, trop complexe à écrire. Cette fois, c’est aussi simple qu’écrire une phrase de base en anglais, et ça marche !

La première fois que j’en ai entendu parler, j’ai négligé Behat parce que je trouvais ça « trop magique pour être vrai ». Et bien non ! Ca fonctionne, et même bien.…

Read more