¿Laravel es realmente tan lento?

82

Acabo de comenzar a usar Laravel. Apenas he escrito ningún código todavía, ¡pero mis páginas están tardando casi un segundo en cargarse!

tiempos de laravel

Esto es un poco impactante para mí cuando mis aplicaciones sin marco y las aplicaciones NodeJS tardan ~ 2ms. ¿Qué está haciendo Laravel? Este no es un comportamiento normal, ¿verdad? ¿Necesita algún ajuste?

mpen
fuente
6
Prueba a correrphp artisan optimize --force
Joseph Silber
13
Para ser justos, los tiempos de carga que está viendo están en el modo de depuración. La barra de depuración que está utilizando ralentiza un poco la aplicación.
kajetons
4
¿Cómo es tu entorno? Veo velocidades más rápidas en un VPS en comparación con el desarrollo local en una máquina virtual.
kreeves
2
@Artsemis Acabo de instalar todo. Es más del doble de lento y se bloquea después de varias actualizaciones.
mpen
9
Sí, no esperes nada rápido usando Vagrant. Una página de Symfony generalmente tarda entre 1 y 2 segundos en cargarse en Vagrant, mientras que tarda 50 ms en producirse.
Matthieu Napoli

Respuestas:

98

Laravel es no realmente que lento. 500-1000ms es absurdo; Lo bajé a 20 ms en modo de depuración.

El problema eran las carpetas compartidas de Vagrant / VirtualBox +. No me di cuenta de que incurrieron en tal impacto de rendimiento. Supongo que debido a que Laravel tiene tantas dependencias (carga ~ 280 archivos) y cada una de esas lecturas de archivos es lenta, se acumula muy rápido.

kreeves me indicó la dirección correcta, esta publicación de blog describe una nueva característica en Vagrant 1.5 que le permite sincronizar sus archivos en la VM en lugar de usar una carpeta compartida.

No hay un cliente rsync nativo en Windows, por lo que tendrá que usar cygwin . Instálelo y asegúrese de marcar Net / rsync. Agregue C:\cygwin64\bina sus caminos. [O puede instalarlo en Win10 / Bash]

Vagrant presenta la nueva función . Estoy usando Puphet, por lo que mi Vagrantfile se ve un poco raro. Tuve que modificarlo para que se viera así:

  data['vm']['synced_folder'].each do |i, folder|
    if folder['source'] != '' && folder['target'] != '' && folder['id'] != ''
      config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", 
        id: "#{folder['id']}", 
        type: "rsync",
        rsync__auto: "true",
        rsync__exclude: ".hg/"
    end
  end

Una vez que esté todo configurado, intente vagrant up. Si todo va bien, su máquina debería arrancar y debería copiar todos los archivos. Deberá ejecutar vagrant rsync-autoen una terminal para mantener los archivos actualizados. Pagará un poco en latencia, pero para cargas de página 30 veces más rápidas, ¡vale la pena!


Si está utilizando PhpStorm, su función de carga automática funciona incluso mejor que rsync. PhpStorm crea una gran cantidad de archivos temporales que pueden hacer tropezar a los observadores de archivos, pero si deja que se encargue de las cargas, funciona bien.


Una opción más es usar lsyncd . He tenido un gran éxito al usar esto en el host de Ubuntu -> invitado de FreeBSD. Todavía no lo he probado en un host de Windows.

mpen
fuente
¿Qué hizo para mejorar su rendimiento (además de utilizar rsync)?
jpcamara
2
@jpcamara Nada. Rsync solo lo redujo a ~ 20ms. Puede ejecutarlo en HHVM, desactivar cualquier depuración y ejecutarlo artisan optimizepara un ligero impulso. Creo que el resto es principalmente cómo diseñas tu aplicación. Instale barryvdh/laravel-debugbary busque cualquier lentitud.
mpen
2
¿Cómo carga 280 archivos en 20 ms? ¿Algún tipo de compilación / OPcache utilizado aquí? Suponiendo almacenamiento SSD, ofc.
Manuel Arwed Schmidt
1
Según Taylor Otwell, Laravel 5.2 será incluso un 25% más rápido: twitter.com/taylorotwell/status/674327734252892161
Koga
1
Utilice el uso compartido de archivos NFS en lugar del predeterminado. Acelera todo 10 veces ... Modifique su archivo Vagrant para forzar el montaje del sistema de archivos como NFS: config.vm.synced_folder ".", "/ Vagrant", escriba: "nfs", nfs: true, nfs_udp: false, nfs_version: 3
Didzis
25

Para ayudarte con tu problema, encontré este blog que habla sobre cómo optimizar la producción de laravel. La mayor parte de lo que necesita hacer para que su aplicación sea rápida ahora estaría en manos de cuán eficiente es su código, su capacidad de red, CDN, almacenamiento en caché, base de datos.

Ahora hablaré del tema:

Laravel es lento fuera de la caja. Hay formas de optimizarlo. También tiene la opción de usar el almacenamiento en caché en su código, mejorando su máquina servidor, yadda yadda yadda. Pero al final, Laravel sigue siendo lento.

Laravel usa muchas bibliotecas de Symfony y, como puede ver en los puntos de referencia de techempower , Symfony ocupa un lugar muy bajo (último por decir lo menos). Incluso puede encontrar que el punto de referencia de laravel está casi en la parte inferior.

Se está llevando a cabo una gran cantidad de carga automática en segundo plano, se cargan cosas que quizás ni siquiera necesite. Entonces, técnicamente, debido a que laravel es fácil de usar, te ayuda a crear aplicaciones rápidamente, también lo hace lento.

Pero no estoy diciendo que Laravel sea malo, es genial , genial en muchas cosas. Pero si espera un gran aumento de tráfico, necesitará mucho más hardware solo para manejar las solicitudes. Te costaría mucho más. Pero si eres asquerosamente rico, puedes lograr cualquier cosa con Laravel. :RE

La compensación habitual:

 Easy = Slow, Hard = Fast

Consideraría que C o Java tienen una curva de aprendizaje difícil y una capacidad de mantenimiento difícil, pero ocupa un lugar muy alto en los marcos web.

Aunque no demasiado relacionado. Solo estoy tratando de probar el punto de easy = slow:

Ruby tiene una muy buena reputación en cuanto a capacidad de mantenimiento y facilidad para aprenderlo, pero también se considera que es el más lento entre python y php, como se muestra aquí .

ingrese la descripción de la imagen aquí

majidarif
fuente
91
¿Qué tienen que ver esos gráficos con la pregunta?
NullPoiиteя
4
PHP7 es mucho más rápido que PHP5
Cobolt
1
¿Que punto? Fácil = lento, solo propaga más malentendidos infundados hacia idiomas particulares
Chris
en infografías, un error es que Pyhon no puede ser influenciado por Java porque java se inventó en 1995 y Python en 1991.
Haritsinh Gohil
@HaritsinhGohil Python 3 fue lanzado en 2008.
majidarif
17

Sí, Laravel ES realmente tan lento. Creé una aplicación POC por este motivo. Enrutador simple, con un formulario de inicio de sesión. Solo pude obtener 60 RPS con 10 conexiones simultáneas en un servidor oceánico digital de $ 20 (pocos GB de RAM);

Preparar:

2gb RAM
Php7.0
apache2.4
mysql 5.7
memcached server (for laravel session)

Ejecuté optimizaciones, el compositor volcó la carga automática, etc., y en realidad bajé el RPS a 43-ish .

El problema es que la aplicación responde en 200-400ms. Ejecuté la prueba AB desde la máquina local en la que estaba laravel (es decir, no a través del tráfico web); y obtuve solo 112 RPS; con un tiempo de respuesta 200ms más rápido con un promedio de 300ms.

Comparativamente, probé mi aplicación PHP Native de producción ejecutando algunos millones de solicitudes al día en un AWS t2.medium (x3, carga balanceada). Cuando hice 25 conexiones simultáneas desde mi máquina local a eso a través de la web, a través de ELB, obtuve aproximadamente 1200 RPS. Gran diferencia en una máquina con carga frente a una página de "inicio de sesión" de Laravel.

Estas son páginas con sesiones (elasticache / memcached), búsquedas de bases de datos en vivo (consultas en caché a través de memcached), activos extraídos de CDN, etc., etc., etc.

Lo que puedo decir, laravel se pega alrededor de 200-300ms de carga sobre las cosas. Está bien para las vistas generadas por PHP, después de todo, ese tipo de retraso es tolerable en la carga. Sin embargo, para las vistas de PHP que usan Ajax / JS para manejar pequeñas actualizaciones, comienza a sentirse lento.

No puedo imaginar cómo se vería este sistema con una aplicación de múltiples inquilinos mientras 200 bots rastrean 100 páginas cada uno al mismo tiempo.

Laravel es ideal para aplicaciones simples. Lumen es tolerable si no necesita hacer nada elegante que requiera tonterías de middleware (IE, sin aplicaciones de múltiples inquilinos y dominios personalizados, etc.);

Sin embargo, nunca me gusta comenzar con algo que pueda enlazar y causar una carga de 300ms para una publicación de "hola mundo".

Si estás pensando "¿A quién le importa?"

.. Escriba una búsqueda predictiva que se base en consultas rápidas para responder a sugerencias de autocompletar en unos cientos de miles de resultados. Ese retraso de 200-300ms volverá locos a sus usuarios.

Mella
fuente
2
¿Por qué es una tontería el middleware? ¿Le importaría explicar con hechos para que todos podamos afirmar que es una tontería? Además, ejecuto una instalación de Laravel que responde felizmente entre 80 y 65 ms (sí, realiza una consulta db en una tabla de registros de 4 mil millones), así que estoy ansioso por ver de qué está hablando.
Mjh
2
Obviamente amas laravel. Configuré una instalación base, optimicé y obtuve resultados deficientes. Descubrí que requería middleware e ingeniería inversa para manejar el procesamiento previo al enrutamiento; que no era ideal. Solo porque tienes "TU" instalación de laravel para optimizar, genial. Es irrelevante. Un paquete básico de enrutamiento HELLO WORLD era mucho más pesado y lento que un marco de enrutamiento simple y un motor de plantillas twig. ¿Se pueden almacenar en caché ambos? Optimizado? ¿Mejorado? Si. ¿Ese es el punto? No. Laravel es pesado. Pesado es lento (más). El mundo está de acuerdo con eso. úsalo si te gusta, pero esto no es teología. :)
Nick
1
Me encanta pasar menos tiempo. Realmente no me importa un marco / tecnología / lo que sea, asumiré que eres igual. Menos tiempo dedicado a lograr una meta = eso es una victoria en mi opinión. Ahora, sí, Laravel es pesado. Cada marco es pesado en comparación con el lenguaje básico. Como cualquier programa / software, Laravel puede ejecutarse rápido, que es el punto de mi comentario. Si un marco le ayuda, si necesita hacerlo funcionar más rápido, eso se puede lograr.
Mjh
Está comparando una instancia no configurada / optimizada / almacenada en caché de Laravel que se ejecuta en un servidor DO de $ 20 con una aplicación php de compilación personalizada, altamente ajustada / optimizada / almacenada en caché, que se ejecuta en una infraestructura de servidor altamente ajustada / optimizada / en caché de $ 400, y luego se queja de que ¿La aplicación no optimizada es lenta? No me malinterpretes, ¡TODOS los marcos son lentos desde el primer momento! No hay forma de ajustar un marco para que funcione para todos. Además, la mayoría de los marcos están configurados para un entorno de desarrollo PRIMERO. Carga automática lenta, plantillas no almacenadas en caché, etc. Por favor compare una manzana con una manzana, no una manzana con un Ferrari, o en este caso, un Zonda ...
jacobfogg
2
CodeIgniter no es lento desde el primer momento. De hecho, CodeIgniter es casi tan rápido como el propio PHP. PHP = 300 rps, CodeIgniter = 295. Laravel está muy por debajo de eso. Zend es alrededor de 30 rps, y pastel, por lo que recuerdo, la friolera de 3 rps. No hay dos marcos iguales. Hay algunas manzanas para mirar. Sin embargo, optimizar Laravel podría proporcionarle cargas de 60 ms, imagínese lo que le proporcionaría la optimización de CodeIgniter. ;)
Webmaster G
13

Descubrí que la mayor ganancia de velocidad con Laravel 4 se puede lograr eligiendo los controladores de sesión correctos;

Sessions "driver" file;

Requests per second:    188.07 [#/sec] (mean)
Time per request:       26.586 [ms] (mean)
Time per request:       5.317 [ms] (mean, across all concurrent requests)


Session "driver" database;

Requests per second:    41.12 [#/sec] (mean)
Time per request:       121.604 [ms] (mean)
Time per request:       24.321 [ms] (mean, across all concurrent requests)

Espero que ayude

Hydrino
fuente
1
Obvio y recomendaría a cualquiera que nunca use el archivo como una sesión. Piense en la escalabilidad :)
jeveloper
6
@jeveloper ¿qué? En este ejemplo, el archivo es 4 veces más rápido que la base de datos
developerbmw
1
@Brett "pensar en la escalabilidad" era el punto, seguro que las llamadas de archivo vs red a una máquina posiblemente remota (incluso si está dentro de la misma VPC) serían más lentas, pero al menos es sostenible y captura datos de sesión
jeveloper
@jeveloper, ¿el sistema de archivos no es sostenible? Espero que lo sea, ya que de todos modos ese es el almacenamiento subyacente para la mayoría de las bases de datos.
developerbmw
3
@developerbmw Lo que está tratando de decir es que si tiene un equilibrador de carga y múltiples instancias que atienden su aplicación, usar el sistema de archivos del servidor local no es escalable.
Chris Harrison
10

De mi concurso Hello World, ¿Cuál es Laravel? Creo que puedes adivinar. Usé el contenedor docker para la prueba y aquí están los resultados

Para hacer http-response "Hello World":

  • Golang con salida estándar del controlador de registros: 6000 rps
  • SpringBoot con salida estándar del controlador de registros: 3600 rps
  • Laravel 5 sin registro: 230 rps
Aggarat .J
fuente
No sé por qué se ha marcado como propio, sí, quizás sea más apropiado como comentario. Aunque también experimento tiempos de respuesta EXTREMADAMENTE lentos dentro de un contenedor Docker ~ 600ms
AndrewMcLagan
¿Intentaste el almacenamiento en caché de rutas?
Oğuz Can Sertel
que es rps? solicitudes por segundo?
user3494047
3
Hello world es la mejor y más útil aplicación que existe, especialmente cuando se usa para pruebas significativas. Cubre totalmente todo lo que necesita saber, desde qué componente se utiliza hasta el soporte del administrador de paquetes / paquetes para un idioma.
Mjh
1
Solo quiero una línea de base de rendimiento sin otra dependencia complicada
Aggarat .J
5

Utilizo bastante Laravel y simplemente no creo los números que me dice porque la renderización de un extremo a otro según la medición de mi navegador muestra un tiempo total MÁS BAJO desde la solicitud hasta la preparación.

Además, obtengo números ligeramente más altos en mi máquina en el trabajo, lo que ejecuta la página notablemente más rápido que mi máquina en casa.

No sé cómo se calculan esos números, pero no están corroborados por la observación, o herramientas de navegador como Firebug ...

Laravel no es tan lento, especialmente cuando está optimizado. Sin embargo, tiene hambre de memoria. Incluso un CMS pesado como Drupal, que es muy lento, parece tener aproximadamente 1/3 de la huella de memoria de una solicitud básica de Laravel.

Por lo tanto, para ejecutar Laravel en producción, lo implementaría en servidores optimizados para memoria antes que en servidores optimizados para CPU.

AgmLauncher
fuente
No estoy seguro de si esos números son acertados, pero definitivamente se nota. ¿Qué quiere decir "especialmente cuando está optimizado"? ¿Cómo lo estás optimizando? ¿Simplemente corriendo php artisan optimizeo hay más que podamos hacer?
mpen
En estos dos enlaces se describen un par de cosas que puede hacer: crynobone.com/posts/7/crunching-laravel-4-for-production-server | lutro.priv.no/posts/optimizing-for-production-with-laravel-4
AgmLauncher
3

Sé que esta es una pregunta un poco vieja, pero las cosas cambiaron. Laravel no es tan lento. Como se mencionó, las carpetas sincronizadas son lentas. Sin embargo, en Windows 10 no pude usar rsync. Probé ambos cygwiny minGW. Parece que rsynces incompatible con git for windowsla versión de ssh.

Esto es lo que funcionó para mí: NFS .

Documentos vagabundos dice:

Las carpetas NFS no funcionan en hosts de Windows. Vagrant ignorará su solicitud de carpetas sincronizadas con NFS en Windows.

Esto ya no es cierto. Podemos usar vagrant-winnfsd plugins hoy en día. Es realmente sencillo de instalar:

  1. Ejecutar vagrant plugin install vagrant-winnfsd
  2. Cambio en su Vagrantfile:config.vm.synced_folder ".", "/vagrant", type: "nfs"
  3. Agregar a Vagrantfile:config.vm.network "private_network", type: "dhcp"

Eso es todo lo que necesitaba para NFSfuncionar. El tiempo de respuesta de Laravel disminuyó de 500 ms a 100 ms para mí.

frutalidad
fuente
¿Probaste rsync a través de Bash para Windows? Lo estoy ejecutando ahora mismo y funciona muy bien.
mpen
No, no lo intenté. Lo sé, mucha gente escribe que rsync también funciona muy bien con git bash o Windows cmd. No sé por qué no me funciona. Pero encontré otra solución de todos modos. Tal vez sea útil para alguien.
frutality
1

¡Me enfrenté 1.40smientras trabajaba con un laravel puro en el área de desarrollo!

el problema estaba usando: php artisan servepara ejecutar el servidor web

cuando usé el servidor web apache (o NGINX) en lugar del mismo código, lo bajé a 153ms

soheil yo
fuente
1

Como nadie más lo ha mencionado, descubrí que el depurador xdebug aumentó drásticamente el tiempo. Serví una página dinámica básica "Hola mundo, la hora es 2020-01-01T01: 01: 01.010101" y usé esto en mi httpd.conf para cronometrar la solicitud:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" **%T/%D**" combined

% T es el tiempo de servicio en segundos,% D es el tiempo en microsegundos. Con esto en mi php.ini:

[XDebug]
xdebug.remote_autostart = 1
xdebug.remote_enable = 1

Obtuve tiempos de respuesta de alrededor de 770 ms, pero con ambos configurados en 0 para deshabilitarlos, saltó a 160 ms instantáneamente. Ejecutar ambos lo redujo a 120 ms:

php artisan route:cache
php artisan config:cache

La desventaja es que si hice cambios de configuración o ruta, necesitaría volver a almacenarlos en caché, lo cual es molesto.

Como nota al margen, curiosamente, mover el sitio de mi SSD a un disco duro giratorio no proporcionó beneficios de rendimiento, lo cual es muy extraño para mí, pero supongo que tal vez esté almacenado en caché, estoy en Windows 10 con XAMPP.

turiyag
fuente
-10

Laravel es lento, porque en la mayoría de los casos, usar PHP para páginas web es lento.

Con Laravel, todo el marco se reconstruye en cada invocación; es por eso que todas las páginas apuntan a index.php. Dado que todo el marco son scripts PHP, todos deben pasar por el intérprete de PHP, cada vez. Cuanto más grande sea el marco, más tiempo llevará.

Compare esto con un "entorno de servidor" (por ejemplo, tomcat) donde el servidor ejecuta el código de inicialización una vez y, finalmente, todas las páginas estarán en código nativo (después de JIT).

Como ejemplo de referencia, usando el mismo hardware, sistema operativo, etc., un simple 'hola mundo' usando JSP en este hardware es de 3000 rps, el mismo hola mundo en laravel es de 51 rps.

La forma más fácil de probar la sobrecarga del marco y el RPS máximo resultante por núcleo es usar Apache AB y un valor de concurrencia de 1, con un simple 'hola mundo' que es dinámico (para evitar el almacenamiento en caché de páginas estáticas).

robert engels
fuente