Analyse de Drupal 8 vu depuis PHP

Menu principal

Cet article tente d’analyser le poids de Drupal 8 (premières versions) et ses conséquences.

Les chiffres de cette page sont issus d’une version de septembre 2013 de Drupal 8 et peuvent donc évoluer.

Les tests ont été effectués sur un Linux Mint 15, Apache 2.22, PHP 5.4.9, MySQL 5.5.32.

Quelques chiffres

Pour une installation fraîche, sans ajout ou activation de modules supplémentaires ni création de contenu, Drupal 8 c’est :

Le code PHP brut s’entend en retirant les commentaires et les espaces grâce à la commande en ligne php -w.

Les chiffres donnés ne prennent pas en compte les fichiers PHP générés dynamiquement, notamment ceux générés par Twig ou ceux générés par le composant d’injection de dépendance de Symfony. Pour le cas n°2, là où mon analyse a compté 537 fichiers PHP, XCache en a comptabilisé 568.

Concernant la mise en cache du code PHP par un outil comme XCache, il faut compter un rapport de 4 pour 1 pour la taille des objets créés. Par exemple, le fichier core/includes/errors.inc qui pèse 13,52 Kio nécessitera 58,26 Kio pour être mis en cache par XCache. Dans le cadre des exemples données ci-dessus, il faut compter un espace de 20 Mio minimum pour garder en cache tous les fichiers PHP nécessaires (XCache est réglé sur 16 Mio en standard et les chiffres donnés ici correspondent à une installation standard fraîche sans ajout de module ou de contenu).

Patch des fichiers PHP

Pour la découverte des fichiers PHP chargés lors du traitement d’une requête HTTP par Drupal, j’ai inséré dans chaque fichier PHP le bout de code suivant :

php
$fh = fopen("/tmp/drupaltrace.txt", 'a');
fwrite($fh, __FILE__."\n");
fclose($fh);

Son fonctionnement est très simple : il ouvre le fichier /tmp/drupaltrace en mode ajout, écrit le chemin complet du fichier en cours (__FILE__) et referme le fichier.

Pour ajouter ce bout de code PHP à plus de 5000 fichiers, j’ai écrit un script Bash qui parcourt toute l’arborescence de Drupal, recherche les fichiers écrits en PHP (pas seulement ceux ayant l’extension .php) et ajoute les 3 lignes présentées ci-dessus. Le script profite d’une règle d’écriture des fichiers sous Drupal à savoir que les fichiers ne contiennent pas le terminateur ?>. On peut donc ajouter lignes de codes souhaitées sans se soucier de ce terminateur.

shell
#!/usr/bin/env bash
find drupal -type f -print | while read file
do
    if (head --lines=1 "$file" | grep --silent '^<[?]php')
    then
        printf "\n\$fh = fopen(\"/tmp/txt\", 'a');\n" >> "$file"
        printf "fwrite(\$fh, __FILE__.\"\\\\n\");\n" >> "$file"
        printf "fclose(\$fh);\n" >> "$file"
    fi
done

Extensions

Drupal utilise 57 extensions dont voici la liste par ordre décroissant d’utilisation :

Pour obtenir ces chiffres, la ligne de commande suivante a été utilisée :

shell
find . -type f | grep -o '\.[^./]*$' | sort | uniq --count

Exemple de liste de fichiers PHP chargés par Drupal 8

Voici un exemple de liste de fichiers PHP chargés par Drupal pour afficher la page d’accueil d’une installation standard fraîche en visite anonyme avec le cache activé. La page a plusieurs fois été demandée, le cache est à priori correctement rempli. Cela représente 4,3 Mio, 497 fichiers, 10 niveaux de profondeur :

<root>