variable tutorial poo interfaces implementacion ejemplos clases clase abstractas abstracta php apache slim

tutorial - php class



Error intermitente de clase abstracta de PHP (4)

Creo que te has topado con este error de opcache . Esta no es exactamente la misma situación pero probablemente está relacionada.

Después de llamar a la función opcache_reset () encontramos algunos errores extraños. Sucede aleatoriamente en servidores (10 de 400 servidores de producción)

Algunas letras a reemplazadas por otras, la clase parece estar ya declarada ... etc

Ejemplo de errores desencadenados después de opcache_reset ():

  • Error fatal de PHP: la Clase XXX contiene 1 método abstracto y, por lo tanto, debe declararse abstracto o implementar los métodos restantes (YYY :: funczzz) en /dir/dir/x.php en la línea 20

El ticket está cerrado porque los desarrolladores no tienen suficiente información para reproducirlo. Si pudiera encontrar el caso más pequeño reproducible, recomiendo reportarlo . Cree una aplicación Slim muy pequeña y luego use JMeter u otra herramienta para realizar muchas solicitudes. Publique sus hallazgos.

Mientras tanto, la única solución podría ser apagar opcache en php.ini:

opcache.enable=0

Por supuesto, esto afectará drásticamente el rendimiento. Hasta que se arregle, tendrá que elegir entre el rendimiento o reiniciar periódicamente Apache.

Si desactivar el caché no funciona, entonces la única causa que podría pensar es en un problema intermitente con el compilador de opcode. En caché o no la versión compilada debe tener un error en ella. La apertura de un ticket reproducible con los desarrolladores de PHP o la depuración de la fuente de PHP sería la única forma de avanzar si esta es la causa.

He estado luchando contra esto por un tiempo, y no puedo resolverlo, tal vez alguien más lo haya hecho o tal vez haya un problema más profundo aquí con Slim, PHP, Apache, etc. Después de trabajar bien durante horas, mi instalación de Slim comenzará a dar esto en todas las rutas:

Error grave: Class Slim / Collection contiene 1 método abstracto y, por lo tanto, debe declararse abstracto o implementar los métodos restantes (IteratorAggregate :: getIterator) en F: / Projects / example / server / vendor / slim / slim / Slim / Collection.php on linea 21

Enloquecedor, este problema desaparece si reinicio Apache. (Por unas horas de todos modos).

Encontré esto donde alguien tuvo un problema similar hace dos años, y la persona que ayudó a acosarlo sin realmente ayudarlo en absoluto: https://community.apachefriends.org/viewtopic.php?p=250966&sid=96ef58aaeb7fe142a7dcdfd506a8683f

He intentado limpiar e instalar el directorio de proveedores de mi compositor. Esto no lo arregla. Puedo ver claramente que getIterator se implementa como se espera en el archivo en el mensaje de error.

PHP versión 7.0.12, Windows 7, x86 PHP Build

Sucedió de nuevo después de unas horas, con un mensaje de error diferente pero similar:

Error grave: la clase Pimple / Container contiene 1 método abstracto y, por lo tanto, debe declararse abstracta o implementar los métodos restantes (ArrayAccess :: sqlserver) en F: / Projects / example / server / vendor / pimple / pimple / src / Pimple / Container. php en linea 34

Esta pregunta tiene un problema similar y la "resuelve" reiniciando PHP, pero claramente no es una solución real, y no tengo el caché habilitado: PHP 7, Symfony 3: método abstracto de error 1 fatal y, por lo tanto, debe ser declarado Resumen o implementar los métodos restantes.

¿Alguna conjetura? Recuerde: este mensaje está en archivos que no escribí y desaparece al reiniciar Apache. ¿Hay algún almacenamiento en caché con PHP 7 que causaría esto?

Editar 3/10/17:

Sí, he abierto un ticket con Slim. También lo vi en un archivo no delgado (Pimple), así que no creo que sea un problema de Slim. https://github.com/slimphp/Slim/issues/2160

Como dije, mi opcache está apagado. He confirmado que esto es cierto tanto en el archivo php.ini como en phpinfo ().


Me he encontrado con este comportamiento exacto y no fue exactamente un error de opcache, incluso si fue causado por opcache.

El problema era que teníamos varias clases con el mismo nombre base, por ejemplo

Request/GenericProtocol/Dispatcher abstract Request/Protocol1/Dispatcher Request/Protocol2/Dispatcher

Ahora, de forma predeterminada, en nuestra instalación, opcache usó una "optimización" que usó el nombre base solo como clave de caché. Como resultado, cada vez que ocurría una secuencia de comandos para crear una instancia de un despachador de Protocol2 en un caché limpio, saboteaba sutilmente todas las llamadas subsiguientes con Protocol1. Debido a los patrones de uso, este disfrazado como cualquier otro tipo de error.

Al final acabamos de activar la opción apropiada:

opcache.use_cwd booleano

Si está habilitado, OPcache agrega el directorio de trabajo actual a la clave del script, eliminando así posibles colisiones entre archivos con el mismo nombre base. Deshabilitar esta directiva mejora el rendimiento, pero puede romper las aplicaciones existentes .

La condición de ruptura es esta: tienes al menos dos clases con el mismo nombre base .

Nuestra próxima iteración está programada para cambiar el nombre de muchas clases

Request/Protocol1/Dispatcher ==> Request/Protocol1/Protocol1Dispatcher

para poder volver a deshabilitar use_cwd y exprimir algunos porcentajes de rendimiento (los PTB y los PHB creen que vale la pena), pero sé que esto puede no ser posible con todos los marcos existentes.


Si desarrolla en Windows, le recomendaría que NO use XAMPP o WAMPP, y pruebe un servidor de desarrollo real usando Linux en una máquina virtual.

Intente instalar Vagrant y Virtualbox, luego diríjase a puphpet.com, que puede generarle una configuración de máquina virtual. Descomprima la descarga, cd en la carpeta, escriba vagrant up. Entonces simplemente apunta tu host a la máquina virtual. Apuesto a que, una vez que tenga un entorno de desarrollo real, este error desaparecerá. Tu otra opción es Docker, pero eso tiene un poco de una curva de aprendizaje.

El problema no es su código (o su código de proveedor), sino su plataforma.


Tuve el mismo problema al usar CodeIgniter y PHP 7.1.x.

Actualicé a PHP 7.2 y el problema ya no se produjo.