Performances : include VS require (en PHP)
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() ?
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 :
- fonction : la fonction utilisée (sisi)
- chemine : le type de chemin employé pour l’inclusion
- () : appel de la fonction PHP include(‘toto.php’)
- » : appel de la fonction native include ‘toto.php’ (réputée plus rapide …)
- 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.

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 …
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
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.
On peut aussi utiliser la fonctionnalité autoload, qui permet de rendre l’inclusion de script autonome et plus efficace