Problema – Tienda Prestashop con demasiadas peticiones SQL

Pues hoy toca un problema que me pasó justo después de Navidad, y es que por consumo de CPU la gente de hostgator me deshabilitó el acceso a una tienda que creamos. Imagináos que el día después de Navidad os dicen….
“Apologize, but I was forced to suspend the directory /home/XXXXXX/public_html/ as multiple scripts inside were causing high loading issues on the server. Due to it affecting all of the other accounts on the system, we had to take immediate action for the health of the server. ”

Las causas que pude ver… demasiadas entradas de buscadores en los últimos días, no de gente sino de spiders. Extrañamente esto provocaba que hubiera cientos de miles de peticiones sql.

¿Cual fue la primera solución que tomamos?

  • Administración->Estadísticas->Configuración: Poner que las estadísticas se limpiaran automáticamente cada semana (ocupaban bastantes registros en la BBDD)
  • Instalar un robots.txt en el directorio raíz capando aquellos robots que creíamos que provocaban esto.
  • Denegar el acceso a las Ips de estos server temiendo que se tratara de un ataque DDos.

Lo extraño es que pese a que se habían reducido las entradas se seguían realizando cientos de peticiones SQL.

La solución entonces pasó por comprobar qué era lo que pasaba en las tripas de prestashop, y es que corre como todos sabréis sobre smarty. Pues en la carpeta config/ hay un archivo llamado smarty.config.inc.php, y en él, hay un parámetro ($smarty->force_compile = false; )

Nosotros lo teníamos a true y cuando se pasa a producción es necesario ponerlo a false.

Vamos, explicándolo en palabras llanas: si hay 100 visitas al día en la web no pasaba nada pese a que compilaba todo de nuevo, pero en el momento en que lanzabas 1000 visitas o más a la hora entonces se tostaba porque las 1000 veces tenía que compilarlo todo. De esta forma teníamos millones de consultas en 15 días.

Espero que esto haya ahorrado tiempo a la gente que lo vea :S

Nota: Esta tienda estaba hecha con la versión 1.3.7 de prestashop, en prestashop 1.4 hay una opción en preferences->performance que permite seleccionar si queremos forzar o no la compilación, con lo cual es mucho más sencillo de solucionar. Os dejo una imagen sacada de esta web.

 

Como introducir código javascript dentro de vista tpl

El problema que me ha retrasado hoy ha sido exactamente el que podéis leer:

Estaba intentando hacer una validación en un formulario (si estaba marcada la check enviaba un formulario, sino estaba marcada sacaba un mensaje de alerta). Cuando yo insertaba mi pequeño código por alguna oscura razón no funcionaba, hasta que introduje el código entre las etiquetas {literal} {/literal}

De forma que quedó de la siguiente forma:

{literal}
	
{/literal}