[magento] PHP Fatal error: Exception thrown without a stack frame in Unknown on line 0

Estos últimas días hemos tenido que optimizar la carga de servidores con Magento. Una de las tareas es usar un sistema de caché que acelere los scripts php. Usamos apc por compatibilidad con Magento y por que ya viene paquetizado en los repositorios de Debian.

El problema, aparece en el pié de página: «PHP Fatal error:  Exception thrown without a stack frame in Unknown on line 0».
Este error aparece cuando se ha lanzado una excepcion en un lugar donde se no se puede lanzar una excepción por no tener ‘stack frame‘.

Los manejadores de excepciones ‘ exception handlers‘ y los destructores no tienen ‘stack frame‘.
Por lo que combinar por ejemplo un ‘execption handler‘ con un ‘error preporting‘  o lanzar un execption en un destructor puede provocar que aparezcan. Os podeis documentar más en este interesante enlace Solving “Fatal error: Exception thrown without a stack frame in Unknown on line 0″

En nuestro caso, tan solo hizo falta acutalizar la version del apc con un simple aptapt-get install php-apc

En la máquina estaba previamente instalado el apc vía pecl

[magento] activar logs

Para activar los logs en magento hay que dirigirse a :

Panel administrador / sistema / configuracion / Avanzado ( menu izquierda abajo )/ Desarrollador / Log settings -> habilitado – > si

[ayuda magento] optimizando y acelerando

Esos días he revisado un par de artículos para mejorar el rendimiento de una tienda magento. Básicamente en toda la documentación se remite a los mismo puntos :

  • Instalacion de opcode cache con XCache o APC
  • Activar keepalive en apache
  • Montar var/sessions y var/cache sobre tmpfs

Además detalles de como optimizar magento , y en este artículo tambien se comenta el uso de memcached

[ayuda magento] Errores al importar base de datos magento

Magento es un software en auge entre los interesados en montar tiendas virtuales. Parece que Oscommerce ya tiene un sustituto fuerte, bien diseñado, estructurado, mvc, modulable y con pasarelas de pago maduras.
Uno de los problemas es que requiere php 5.2. Como muchos sabrán php 4 dejó de ser soportada hace años, pero aún existen distribuciones que oficialmente distribuyen la php 5.0 o 5.1 en su rama estable. Este es el caso de Centos 5 / RHEL 5 que necesita de repositorios no oficiales para subir a version php 5.2.

Bien, puestos en situación, el caso  se nos ha presentado un caso extraño de consumo de memoria desorbitado y totalmente desconcertante. Después de realizar todo tipo de pruebas para localizar este agujero negro de ram, hemos decidido cambiar a otro servidor basado en Debian que sí distribuyen php 5.2 en su rama ‘stable‘.

La migración ha sido un poco más problemática de lo habitual ya que Magento está muy preparado para el control de errores y no suelta los errores como habitualmente en error_log o en consola. Por ello hay que activar las siguientes lineas en index.php:

  • Mage::setIsDeveloperMode(true);
  • ini_set(‘display_errors’, 1);

De esta forma, sí nos vuelca los errores pon pantalla pero usando un manejador del propio Magento.

Otra piedra en el camino para el cambio del servidor ha sido este error con los índices de mysql

ERROR 1064 (42000) at line 25: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8' at line 10

Al parecer hay algún pequeño cambio de como definir el indice basado en BTREE ( acelera las búsquedas ) y no son totalmente compatibles la versión de Centos ( mysql 5.1 ) y la Debian ( mysql 5.0) . Si existe algún bug abierto en Debian, lo desconozco, aunque lo buscaré 😀

La linea original del volcado es PRIMARY KEY (`actualidad_id`) USING BTREE y debe ser sustituida por PRIMARY KEY  USING BTREE (`actualidad_id`) para los más cómodos :

sed -i 's/PRIMARY KEY (`actualidad_id`) USING BTREE/PRIMARY KEY  USING BTREE (`actualidad_id`)/' volcado.sql

Igualmente para este otro error:

ERROR 1064 (42000) at line 390: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'USING BTREE,
 KEY `FK_ATTRIBUTE_VARCHAR_ENTITY` (`entity_id`),
 KEY `FK_CATALO' at line 9

el cambio sería :

mysql 5.1 UNIQUE KEY `IDX_BASE` (`entity_type_id`,`entity_id`,`attribute_id`,`store_id`) USING BTREE,
mysql 5.0 UNIQUE KEY `IDX_BASE` USING BTREE (`entity_type_id`,`entity_id`,`attribute_id`,`store_id`),

sed -i 's/UNIQUE KEY `IDX_BASE` (`entity_type_id`,`entity_id`,`attribute_id`,`store_id`) USING BTREE,/UNIQUE KEY `IDX_BASE` USING BTREE (`entity_type_id`,`entity_id`,`attribute_id`,`store_id`),/' volcado

Más información acerca de la sintaxis de mysql en http://dev.mysql.com/doc/refman/5.0/en/create-table.html