Préchargement en PHP 7.4

La traduction de cet article a été préparée spécialement pour les étudiants du cours Backend PHP Developer .



PHP 7.4 ajoute le préchargement, une fonctionnalité qui peut considérablement améliorer les performances du code.

En précharge en bref.

  • Pour précharger les fichiers, vous devez écrire un script PHP distinct.
  • Ce script est exécuté une fois au démarrage du serveur.
  • Tous les fichiers préchargés sont disponibles en mémoire pour toutes les demandes.
  • Les modifications apportées au fichier source ne fonctionneront pas tant que vous n'aurez pas redémarré le serveur.

Parlons plus en détail de la nouvelle fonctionnalité.


Plus que Opcache


Oui, le préchargement est basé sur opcache, mais ce n'est pas exactement la même chose. Opcache prend les fichiers source PHP, les compile en opcodes, puis enregistre les fichiers compilés sur le disque.

Les opcodes peuvent être considérés comme une représentation de bas niveau de votre code qui est facilement interprétable lors de l'exécution. Ainsi, opcache vous permet de sauter l'étape de traduction des fichiers source en ce dont l'interpréteur PHP a réellement besoin au moment de l'exécution. Des économies notables!

Cependant, vous pouvez économiser encore plus. opcash avec des fichiers opcash ne savent rien des autres fichiers. Si vous avez la classe A, qui est une extension de la classe B, ils devront toujours être liés au moment de l'exécution. De plus, opcache vérifie si les fichiers source ont changé, et lors de la détection des modifications invalidera leurs caches.

Et ici, la précharge vient à la rescousse: elle compile non seulement les fichiers source en opcodes, mais relie également les classes, les traits et les interfaces dépendants. Il stocke un tel fragment «compilé» de code exécutable (c'est-à-dire du code que l'interpréteur PHP peut utiliser) en mémoire.

Lorsqu'une requête arrive sur le serveur, il peut utiliser des parties de la base de code qui a déjà été chargée en mémoire, sans temps supplémentaire.

De quelles «parties de la base de code» parlons-nous?


Pratiquer le préchargement


Pour un préchargement correct, le développeur doit indiquer au serveur les fichiers à télécharger. Cela se fait à l'aide d'un simple script PHP, il n'y a donc rien à craindre.

Rien de compliqué.

  • Vous fournissez un script de préchargement et un lien vers celui-ci dans votre fichier php.ini en utilisant opcache.preload .
  • Chaque fichier PHP que vous souhaitez précharger doit être transmis à opcache_compile_file() partir du script de préchargement.

Supposons que vous souhaitiez précharger une sorte de cadre. Que ce soit Laravel. Dans ce cas, votre script doit regarder tous les fichiers PHP dans le vendor/laravel et les ajouter un à la fois.

Voici comment vous pouvez inclure ce script dans php.ini:

 opcache.preload=/path/to/project/preload.php 


Et voici un exemple d'implémentation:

 $files = /*  ,      */; foreach ($files as $file) { opcache_compile_file($file); } 

Au lieu de opcache_compile_file vous pouvez utiliser include . Cependant, il semble qu'il y ait eu un bogue ici , car au moment de l'écriture, la deuxième option ne fonctionnait pas.

Avertissement que vous ne pouvez pas précharger une classe non liée


Il y a un avertissement Vous ne pouvez pas précharger la classe non liée ? Le fait est qu'avant de précharger les fichiers, vous devez également précharger leurs objets dépendants - interfaces, traits et classes parent.

Si vous rencontrez des problèmes avec les dépendances de classe, vous en serez averti lors du démarrage du serveur:

 Can't preload unlinked class Illuminate\Database\Query\JoinClause: Unknown parent Illuminate\Database\Query\Builder 

Notez que opcache_compile_file() uniquement le fichier, mais ne l'exécutera pas. Cela signifie que si une classe a des dépendances qui n'ont pas été préchargées, la classe elle-même ne peut pas être préchargée.

Ce n'est pas critique: le serveur fonctionnera comme d'habitude, mais vous n'aurez pas à votre disposition tous les fichiers que vous vouliez précharger.

C'est pourquoi vous devez sélectionner soigneusement les fichiers à pré-charger afin d'éviter les problèmes de dépendance. Le faire manuellement est une tâche ingrate et fastidieuse, les développeurs travaillent donc déjà sur des solutions automatisées.

Prise en charge des compositeurs


La solution automatisée la plus prometteuse est en cours de préparation par les développeurs de compositeurs, qui est déjà utilisée dans la plupart des projets PHP modernes.

Maintenant, les gars travaillent sur la possibilité de configurer la précharge dans composer.json , qui à son tour va générer un fichier de précharge à votre place. Comme le préchargement lui-même, cette fonctionnalité est toujours en cours de développement. Vous pouvez suivre l'évolution des événements ici .
Heureusement, vous n'avez pas à configurer manuellement les fichiers de préchargement si vous ne le souhaitez pas - composer peut le faire pour vous.

Configuration requise pour le serveur


Il y a deux autres points importants qu'un développeur doit garder à l'esprit lors de l'utilisation de la précharge.

Vous savez déjà que vous devez créer une entrée dans php.ini pour que la précharge fonctionne. Cela signifie que si vous utilisez l'hébergement mutualisé, vous ne pourrez pas configurer PHP comme vous le souhaitez.

En pratique, vous aurez besoin d'un serveur dédié (virtuel) pour optimiser les fichiers préchargés pour un seul projet. Gardez cela à l'esprit.

Souvenez-vous également que vous devrez redémarrer le serveur (si vous utilisez php-fpm , cela suffit) chaque fois que vous souhaitez recharger des fichiers en mémoire. Pour la plupart, cela est évident, mais il ne sera pas superflu de le rappeler.

Performances


Maintenant, pour la question la plus importante: le préchargement améliore-t-il vraiment les performances?

Bien sûr! Ben Morel a partagé les résultats des tests comparatifs, qui peuvent être trouvés dans le même sujet sur le compositeur , que nous avons mentionné ci-dessus.

Et aussi, c'est intéressant. Si vous le souhaitez, vous pouvez précharger uniquement les soi-disant hot classes - classes qui sont souvent utilisées dans votre base de code. Les tests de Ben Morel montrent que le chargement d'environ 100 de ces classes offre une augmentation des performances plus élevée que le préchargement de tout à la fois. Dans le premier cas, la productivité augmente de 17%, dans le second - de 13%.

Bien sûr, le choix des classes pour le préchargement dépend du projet spécifique. Il est sage de commencer par simplement précharger autant que possible. Si ces quelques pourcentages de différences de performances sont si importants pour vous, vous devrez contrôler le code lors de l'exécution.

Bien entendu, toutes ces opérations peuvent être automatisées, ce qui est susceptible de se faire à l'avenir.

Maintenant, il est important que la prise en charge de la précharge soit ajoutée à composer , ce qui élimine la nécessité de créer des fichiers pour elle-même. Cette fonctionnalité est très facile à configurer sur le serveur, à condition qu'elle soit à votre entière disposition.



Allez-vous utiliser le préchargement dans la nouvelle version de PHP 7.4? Des pensées ou des commentaires? Envoyez-moi un courriel sur Twitter ou par courriel .

Traditionnellement, nous attendons vos commentaires et avantages si vous trouvez l'article intéressant :-)

Source: https://habr.com/ru/post/fr463117/


All Articles