Performances : include VS require (en PHP)

Rédacté le 27/04/2010 WebDev

Tags:

Un nouveau jour, un nouveau bench. Suite à un échange avec @Darklg et @fabienthomas concernant les inclusions de scripts PHP, la question est tombée : Quelle est la manière la plus performante pour inclure des scripts, include() ou require() ?

Crédit photo : kudumomo

Conditions du test

Cet ensemble de tests a été réalisés sur un Pentium 4 double coeur, abreuvé par 3Go de RAM, faisant tourner Apache 2 et PHP 5.3.

Pour réaliser les tests, j’ai crée 500 scripts PHP ayant cette tête :

<?php
  class me_1{
    public function __construct(){
    }
  }
?>

enregistré sous le nom includeme_1.php

Le script « incluant » réalise une simple boucle for() et tente d’inclure les fichiers un à un.
Une seconde version du script tente d’instancier la classe me_1, l’inclusion étant traitée par la fonction autoload() .

Résultats

Trêve de blabla technique, passons au résultats :

Légende :

  1. fonction : la fonction utilisée (sisi)
  2. chemine : le type de chemin employé pour l’inclusion
  3. () : appel de la fonction PHP include(‘toto.php’)
  4.  » : appel de la fonction native include ‘toto.php’ (réputée plus rapide …)
  5. autoload : résultats obtenus avec le second script (sachant que j’ai utililisé les fonctions natives)

Code de test

Vous trouverez dans ce zip les codes utilisés pour réaliser les tests : Benchmark

Conclusion

J’étais parti avec à l’a-priori que include était plus rapide que require, car require bloque le script dans le cas où il ne trouve pas le fichier à inclure, hors cette séance de benchmarking nous montre que les deux fonctions jouent à égalité.
Egalement, les versions « _once » me semblait plus lentes car elles vérifient que le script n’a pas déjà été inclus, et les résultats m’ont donné raison (ouf ^^).
Je pensais également que la fonction « autoload » rajoutait du temps d’exécution, et, à mon grand étonnement, ce n’est pas le cas. Du coup, ça en fait une fonction encore plus intéressante.

Ce test reste synthétique et ne peut correspondre à une utilisation en condition réelle car les scripts à inclure sont vides et assez petits. Toutefois, la répétition par 500x permet, à mon avis, de pallier à cette lacune.

4 commentaires to Performances : include VS require (en PHP)

  • Liliandev dit :

    Ne jamais utiliser require_once ou include_once … c’est quand on ne maitrise pas son code : une absurdité de la part de PHP d’avoir mis ces fonctions à disposition des développeurs …

    • Loïc dit :

      Je suis parfaitement d’accord avec toi pour le manque de maitrise.
      Toutefois, comme ces fonctions font partie de celles mises à disposition pour inclure des scripts, je les ai incluses dans ce test ;)

  • niahoo dit :

    hello,

    quand tu fais une bibliothèque, pas mal de fichiers ont des dépendances. Si tu ne souhaite pas tout inclure d’un coup, par exemple pour profiter d’un seul module de ta lib, ou parce que tu utilises autoload, il peut être intéressant d’utiliser les versions ‘_once’ de ces fonctions.

    Par exemple, si dans un script tu dois créer un objet de la classe Voiture, le fichier contenant cette classe demandera l’inclusion de la classe Véhicule.
    Mais si l’utilisateur à également envoyé des données concernant une moto, alors l’inclusion du fichier pour la classe Moto génèrera une erreur en appelant lui aussi l’inclusion du fichier contenant la classe Véhicule.

    Bien sûr, tu peux inclure en entier ta librairie dès le début du script, mais ça peut rendre ton appli un peu molle.

    • Loïc dit :

      On peut aussi utiliser la fonctionnalité autoload, qui permet de rendre l’inclusion de script autonome et plus efficace :)

  • Leave a Reply

    Notifiez-moi des commentaires à venir via email. Vous pouvez aussi vous abonner sans commenter.

    Bienvenue sur mon blog.
    Il s'agit avant tout d'une zone de veille pour moi, un lieu où je stocke les astuces qui me serviront à nouveau plus tard.
    Au menu, du PHP, javascript, un peu de CSS et des astuces diverses...