web-dev-qa-db-fra.com

Intermittent PHP Erreur de classe abstraite

Je me bats depuis un moment et je n'arrive pas à comprendre, peut-être que quelqu'un d'autre l'a fait ou qu'il y a un problème plus profond ici avec Slim, PHP, Apache, etc. Après avoir travaillé pendant des heures, mon installation Slim va commencer à donner ceci sur toutes les routes:

Erreur fatale: Class Slim\Collection contient 1 méthode abstraite et doit donc être déclaré abstrait ou implémenter les méthodes restantes (IteratorAggregate :: getIterator) dans F:\Projets\exemple\serveur\vendeur\slim\slim\Slim\Collection\php on ligne 21

Ce problème disparaît si je redémarre Apache. (Pendant quelques heures quand même.)

J'ai trouvé ce cas là où une personne avait eu un problème similaire il y a deux ans et que la personne qui l'aidait à harceler sans l'aide du tout: https://community.apachefriends.org/viewtopic.php?p=250966&sid=96ef58aaeb7fe142a7dcdfd506a8683f

J'ai essayé de nettoyer et d'installer le répertoire des vendeurs de mon compositeur. Cela ne le répare pas. Je peux clairement voir que getIterator est implémenté comme prévu dans le fichier dans le message d'erreur.

PHP Version 7.0.12, Windows 7, x86 PHP Construire

Cela s'est produit de nouveau après quelques heures, avec un message d'erreur différent mais similaire:

Erreur fatale: La classe Pimple\Container contient 1 méthode abstraite et doit donc être déclarée abstraite ou implémenter les méthodes restantes (ArrayAccess :: sqlserver) dans F:\Projects\example\server\vendor\pimple\pimple\src\Pimple\Container. php sur la ligne 34

Cette question a un problème similaire et le "résout" en redémarrant PHP, mais ce n'est clairement pas une solution réelle, et je n'ai pas d'opcache activé: PHP 7, Symfony 3: Erreur fatale 1 méthode abstraite et doit donc être déclarée abstraite ou implémenter les méthodes restantes }

Des suppositions? Rappelez-vous: ce message est dans des fichiers que je n'ai pas écrits et disparaît au redémarrage d'Apache. Existe-t-il une mise en cache avec PHP 7 qui provoquerait cela?

Edit 3/10/17:

Oui, j'ai ouvert un ticket avec Slim. Je l'ai également vu dans un fichier non fin (Pimple), donc je ne pense pas qu'il s'agisse d'un problème avec Slim . https://github.com/slimphp/Slim/issues/2160

Comme je l'ai dit, mon opcache est éteint. J'ai confirmé que cela est vrai à la fois dans le fichier php.ini et en regardant phpinfo ().

18
Will Shaver

Je pense que vous avez rencontré ce bug opcache . Ce n'est pas exactement la même situation mais probablement liée.

Après avoir appelé la fonction opcache_reset (), nous rencontrons des erreurs étranges . Cela se produit de manière aléatoire sur des serveurs (production de 10 serveurs sur 400)

Certaines lettres sont remplacées par d’autres, la classe semble être déjà déclarée .. etc

Exemple d'erreurs déclenchées après opcache_reset ():

  • Erreur irrécupérable PHP: La classe XXX contient 1 méthode abstraite et doit donc être déclarée abstraite ou implémenter les méthodes restantes (YYY :: funczzz) in /dir/dir/x.php à la ligne 20

Le ticket est fermé car les développeurs ne disposent pas d'assez d'informations pour le reproduire. Si vous pouviez trouver le plus petit cas reproductible, je vous recommande de le signaler . Créez une très petite application Slim, puis utilisez JMeter ou un autre outil pour effectuer de nombreuses demandes. Postez vos découvertes.

En attendant, la seule solution possible serait de désactiver opcache dans le fichier php.ini:

opcache.enable=0

Bien sûr, cela va nuire considérablement aux performances. Jusqu'à ce que cela soit corrigé, vous devrez choisir entre performances ou redémarrage périodique d'Apache.

Si désactiver le cache ne fonctionne pas, alors la seule cause à laquelle je pourrais penser est un problème intermittent avec le compilateur opcode. En cache ou non, la version compilée doit contenir une erreur. Ouvrir un ticket reproductible avec les devs PHP ou déboguer vous-même la source PHP serait le seul moyen d'avancer si c'est la cause.

10
Matt S

J'ai eu le même problème en utilisant CodeIgniter et PHP 7.1.x.

Je suis passé à PHP 7.2 et le problème ne s'est plus posé.

1
Robson Piere

Si vous développez sur Windows, je vous recommande de NE PAS utiliser XAMPP ou WAMPP, et d'essayer un vrai serveur de développement utilisant Linux sur une machine virtuelle. 

Essayez d’installer Vagrant et Virtualbox, puis dirigez-vous sur puphpet.com, qui peut générer une configuration de machine virtuelle. Décompressez le téléchargement, cd dans le dossier, tapez vagabond. Ensuite, pointez votre hôte vers la machine virtuelle. Je parie que lorsque vous aurez un véritable environnement de développement, cette erreur disparaîtra. Votre autre option est Docker, mais cela demande un peu d’apprentissage.

Le problème n'est pas votre code (ou votre code de fournisseur), mais votre plate-forme.

1
delboy1978uk