Problème
Lorsque vous utilisez PHPUnit version 11 ou plus récente pour gérer et exécuter vos tests unitaires, et que l'agent New Relic PHP est installé et activé, l'exécution du script phpunit (l'exécuteur de tests en ligne de commande PHPUnit) entraînera la consommation de toute la mémoire système disponible avant même l'exécution effective des tests.
Solution
Pour éviter les erreurs de mémoire insuffisante, vous devez explicitly disable l'agent en définissant newrelic.enabled sur false. Vous pouvez le désactiver tout en utilisant phpunit comme ceci :
$php -d newrelic.enabled=false vendor/bin/phpunit tests/Par exemple, pour exécuter un fichier de test spécifique :
$php -d newrelic.enabled=false vendor/bin/phpunit tests/Unit/ExampleTest.phpImportant
Cette solution de contournement désactive toute l'instrumentation New Relic pendant l'exécution des tests unitaires, ce qui signifie qu'aucune donnée APM ne sera collectée pendant l'exécution des tests.
Vous pouvez également désactiver l'agent dans votre fichier de configuration php.ini si vous avez besoin de ce paramètre de manière permanente pour votre environnement de développement :
newrelic.enabled = falseCause
La raison de cette incompatibilité est un nouveau code ajouté dans PHPUnit 11.x : Réappliquer « Vérifier et restaurer les gestionnaires globaux d’erreurs/exceptions » · sebastianbergmann/phpunit@0214cf8. Ce nouveau code récupère la liste des gestionnaires d'exceptions actifs à l'aide d'une méthode qui nécessite de retirer chaque gestionnaire d'exceptions de la stack des gestionnaires d'exceptions. Cependant, l'agent PHP de New Relic installe par défaut son propre gestionnaire d'exceptions et empêche sa suppression de la stack de gestionnaires d'exceptions. L'agent détecte la suppression de son gestionnaire d'exceptions et le réenregistre immédiatement. Cela provoque une boucle infinie dans le script phpunit : PHPUnit ne peut jamais terminer de retirer les gestionnaires de la stack car l'agent PHP New Relic réenregistre continuellement son gestionnaire !