Este año 2018 y parte del 2017, uno de los puntos clave en el SEO y en general desarrollo web es la velocidad de tu sitio, aunque llevo años optimizando, siempre se te olvida y al final pasa lo que pasa… Que mides con el PageSpeed o el GtMetrix alguna de tus paginas y te echas las manos a la cabeza.
Update 2018. Es posible que te ayude enormemente en la tarea Laravel Debugbar, que simplifica mucho la tarea de consultar el tiempo de respuesta y optimizar la app de una forma MUY FÁCIL. He escrito algo sobre el tema.
Por parte del código, por regla general, hay que hacer un «refactor» constante del código y optimización de las «querys», como te descuides puedes tener tiempos de mas de 1 segundo en Laravel, siempre y cuando hablamos de bases de datos considerables, tirando a grandes. Aquí nos centramos en reducir el tiempo de respuesta del framework.
Antes de nada… ¿Cómo mido el tiempo de respuesta?
En el enlace de GtMetrix que he puesto arriba, se proporciona ese dato cuando analizas tu pagina, dentro de la pestaña «Waterfall», también es posible que lo puedas ver en la pestaña network de la consola de Google Chrome. Yo recomiendo hacerlo con este simple comando de curl, que te vale para cualquier distribuición de Linux o MacOS.
1 |
curl -o /dev/null -s -w %{time_total}\\n http://www.google.es |
Te devolverá un valor, del tipo 0,787 o algo así, lógicamente son segundos. Tu tarea básicamente es reducir este numero a algo más aceptable, idealmente por debajo de 0,20, creo que PageSpeed se queja a partir de este numero.
Pues si, el modo más fácil identificar que es lo que te come los recursos, es eliminar partes del código en un entorno de pruebas y ejecutar el comando. Te aseguro que en 10 minutos, veras el problema.
Cache es tu amigo…
Al menos en mi caso, el mayor problema consiste en un mal uso del cache y consultas a la base de datos. Me he dado cuenta, que Laravel no es lento, ni mi servidor sufre un ataque DDOS, es que ocasionalmente soy un «ñapas». Tampoco suelen ayudar mucho «php artisan route:cache» o similar.
Te recomiendo el uso Cache:remember para optimizar tanto consultas como partes de código donde se realiza bastante calculo, veamos un ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public function get_lat_lng($latitud, $longitud, $constante, $provincia_id) { //Aplicar Constante $lat_min = $latitud - $constante; $lat_max = $latitud + $constante; $lng_min = $longitud - $constante; $lng_max = $longitud + $constante; $cercanos = DB::table("concerts")->consultaDeLaPolla()->get(); $distancias = array(); foreach($cercanos as $row) { $dst = $this->harvestine($latitud, $longitud, $row->latitud, $row->longitud); //Mas código... } //Ordenamos y recortamos ksort($distancias); return array_splice($distancias, 0, 10); } |
Es una aproximación para calcular sitios cercanos a un determinado lugar. Algo así como no tengas cuidado, te añade fácilmente 0,5 segundos a tu respuesta del servidor. Pero si utilizamos el cache:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public function get_lat_lng($latitud, $longitud, $constante, $provincia_id) { $resultado = Cache::remember("cercanos-{$provincia_id}", 360, function () use ($provincia_id, $latitud, $longitud, $constante) { //Aplicar Constante $lat_min = $latitud - $constante; $lat_max = $latitud + $constante; $lng_min = $longitud - $constante; $lng_max = $longitud + $constante; $cercanos = DB::table("concerts")->consultaDeLaPolla()->get(); $distancias = array(); foreach($cercanos as $row) { $dst = $this->harvestine($latitud, $longitud, $row->latitud, $row->longitud); //Mas código... } //Ordenamos y recortamos ksort($distancias); return array_splice($distancias, 0, 10); }); return $resultado; } |
Guardamos todo eso durante 3600 minutos y encima te lo conserva ya ordenado. Ojo que la ordenación de un array en el mejor de los casos tiene la complejidad de Nlog(N) y estándar N^2, como dos bucles anidados…
Ademas puedes utilizar Cache::rememberForever() para almacenar cosas tan triviales como categorías, provincias, tipos y similar, que sabes que nunca cambiaran. En resumen, que uses el cache siempre y cuando puedas. Ya sabes, que debajo tienes comentarios para críticar.