Laravel est-il si lent?

Je viens de commencer à utiliser Laravel. J'ai à peine écrit de code pour le moment, mais mes pages prennent près d'une seconde à charger!

laravel timings

C'est un peu choquant pour moi quand mes applications sans cadre et mes applications NodeJS prennent ~2ms. Que fait Laravel? Ce n'est pas un comportement normal, n'est-ce pas? Est-il besoin de quelques retouches?

61
demandé sur mpen 2014-04-25 07:18:36

8 réponses

Laravel est pas fait que lent. 500-1000ms est absurde; je l'ai descendu à 20ms en mode débogage.

Le problème était Vagrant / VirtualBox + dossiers partagés. Je ne savais pas, ils ont été exposés à de telles performances. Je suppose que parce que Laravel a tant de dépendances (charge ~280 fichiers) et que chacune de ces lectures de fichiers est lente, elle s'additionne très rapidement.

Kreeves m'a pointé dans la bonne direction, Ce billet de blog décrit une nouvelle fonctionnalité de Vagrant 1.5 qui vous permet de synchroniser vos fichiers dans la machine virtuelle plutôt que d'utiliser un dossier partagé.

Il n'y a pas de client rsync natif sous Windows, vous devrez donc utiliser cygwin. Installez-le, et assurez-vous de cocher Net/rsync. Ajoutez C:\cygwin64\bin à vos chemins.

Vagrant présente la nouvelle fonctionnalité. J'utilise Puphet, donc mon fichier Vagrant a l'air un peu drôle. J'ai dû le modifier pour ressembler à ceci:

  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

Une fois que vous êtes tous mis en place, essayez vagrant up. Si tout se passe bien votre machine devrait démarrez et il devrait copier tous les fichiers. Vous devrez exécuter vagrant rsync-auto dans un terminal pour garder les fichiers à jour. Vous paierez un peu de latence, mais pour un chargement de page 30x plus rapide, ça vaut le coup!


Si vous utilisez PhpStorm, sa fonction de téléchargement automatique fonctionne encore mieux que rsync. PhpStorm crée beaucoup de fichiers temporaires qui peuvent déclencher des observateurs de fichiers, mais si vous le laissez Gérer les téléchargements lui-même, cela fonctionne bien.

82
répondu mpen 2014-09-30 20:44:48

Pour vous aider avec votre problème, j'ai trouvé ce blog qui parle de rendre la production de laravel optimisée. La plupart de ce que vous devez faire pour rendre votre application rapide serait maintenant entre les mains de l'efficacité de votre code, de votre capacité réseau, CDN, mise en cache, base de données.

Maintenant, je vais parler de la question:

Laravel est lent hors de la boîte. Il y a des moyens de l'optimiser. Vous avez également la possibilité d'utiliser la mise en cache dans votre code, en améliorant votre machine serveur, yadda yadda yadda. Mais à la fin Laravel est encore lent.

Laravel utilise beaucoup de bibliothèques symfony et comme vous pouvez le voir dans les benchmarks de techempower , symfony se classe très bas (dernier pour dire le moins). Vous pouvez même trouver le benchmark laravel {[4] } presque en bas.

Beaucoup de chargement automatique se passe en arrière-plan, des choses dont vous n'avez peut-être même pas besoin sont chargées. Donc techniquement parce que laravel est facile à utiliser, il vous aide à construire des applications rapides, il le rend également lent.

Mais je ne dis pas que Laravel est mauvais, c'estgénial , génial à beaucoup de choses. Mais si vous vous attendez à une forte augmentation du trafic, vous aurez besoin de beaucoup plus de matériel juste pour gérer les demandes. Il vous en coûterait beaucoup plus. Mais si vous êtes riche sale alors vous pouvez réaliser n'importe quoi avec Laravel. : D

Le compromis habituel:

 Easy = Slow, Hard = Fast

Je considérerais que C ou Java ont une courbe d'apprentissage difficile et une maintenabilité difficile, mais il se classe très haut dans le web Framework.

Mais pas trop liés. J'essaie juste de prouver le point de easy = slow:

Ruby a une très bonne réputation en termes de maintenabilité et de facilité à l'apprendre, mais il est également considéré comme le plus lent parmi python et php comme montré ici.

entrez la description de l'image ici

21
répondu majidarif 2014-04-25 14:28:56

J'ai trouvé que le plus grand gain de vitesse avec Laravel 4, Vous pouvez choisir les bons pilotes de session;

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)

J'espère que cela aide

12
répondu Hydrino 2014-10-01 06:29:39

De mon concours Hello World, lequel est Laravel? Je pense que vous pouvez deviner. J'ai utilisé le conteneur docker pour le test et voici les résultats

Pour faire une réponse http "Hello World":

  • Golang avec gestionnaire de journaux stdout: 6000 rps
  • SpringBoot avec Gestionnaire de journaux stdout: 3600 rps
  • Laravel 5 avec le journal :230 rps
11
répondu Aggarat .J 2016-01-06 08:36:11

Oui - Laravel est vraiment si lent. J'ai construit une application POC pour ce bien. Routeur Simple, avec un formulaire de connexion. Je n'ai pu obtenir que 60 RPS avec 10 connexions simultanées sur un serveur digital ocean de 20 $(quelques Go de ram);

Configuration:

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

J'ai exécuté des optimisations, composer dump autoload etc, et en fait a abaissé le RPS à 43-ish .

Le problème est que l'application répond dans 200-400ms. j'ai couru AB test de la machine locale laravel était sur (ie, pas par le trafic web); et je n'ai eu que 112 RPS; avec un temps de réponse 200ms plus rapide avec une moyenne de 300ms.

Comparativement, j'ai testé mon application Native PHP de production exécutant quelques millions de requêtes par jour sur un t2 AWS.moyen (X3, charge équilibrée). Quand J'ai AB'D 25 connexions simultanées de ma machine locale à cela sur le web, via ELB, j'ai eu environ 1200 RPS. Énorme différence sur une machine avec charge vs une page laravel "login".

Ce sont des pages avec des Sessions (elasticache / memcached), des recherches de base de données en direct (mises en cache requêtes via memcached), actifs tirés sur CDNs, etc, etc, etc.

Ce que je peux dire, laravel colle à environ 200-300ms de charge sur les choses. C'est bien pour les vues générées par PHP, après tout, ce type de retard est tolérable en charge. Cependant, pour les vues PHP qui utilisent Ajax / JS pour gérer les petites mises à jour, il commence à se sentir lent.

Je ne peux pas imaginer à quoi ressemblerait ce système avec une application multi-locataires tandis que 200 robots rampent 100 pages chacun en même temps.

Laravel est idéal pour des applications simples. Lumen est tolérable si vous n'avez pas besoin de faire quelque chose de fantaisie qui nécessiterait un non-sens middleware (C'est-à-dire, pas d'applications multi-locataires et de domaines personnalisés, etc.);

Cependant, je n'aime jamais commencer avec quelque chose qui peut lier et provoquer une charge de 300ms pour un post "hello world".

Si vous pensez " qui s'en soucie?"

.. Écrivez une recherche prédictive qui repose sur des requêtes rapides pour répondre aux suggestions de saisie semi-automatique à travers quelques centaines de milliers de résultats. Ce décalage de 200-300ms va conduire vos utilisateurs absolument fou.

9
répondu Nick 2016-12-07 06:35:31

J'utilise Laravel un peu et je ne crois tout simplement pas les chiffres qu'il me dit parce que le rendu de bout en bout tel que mesuré par mon navigateur montre moins de temps total entre la demande et le prêt.

De plus, j'obtiens des nombres légèrement plus élevés sur ma machine au travail, ce qui exécute la page sensiblement plus rapidement que ma machine à la maison.

Je ne sais pas comment ces chiffres sont calculés, mais ils ne sont pas corroborés par l'observation, ou les outils de navigateur comme Firebug...

Laravel est pas vraiment si lent, surtout lorsqu'il est optimisé. Il est affamé de mémoire cependant. Même un CMS lourd comme Drupal qui est très lent, semble avoir environ 1 / 3rd l'empreinte mémoire d'une requête Laravel bare bones.

Ainsi, pour exécuter Laravel en production, Je déploierais sur des serveurs optimisés en mémoire avant des serveurs optimisés en CPU.

4
répondu AgmLauncher 2014-04-25 06:12:26

Je sais que c'est une petite vieille question, mais les choses ont changé. Laravel n'est pas si lent. C'est, comme mentionné, les dossiers synchronisés sont lents. Cependant, sur Windows 10, Je n'ai pas pu utiliser rsync. J'ai essayé à la fois cygwin et minGW. Il semble que rsync soit incompatible avec la version de git for windows de ssh.

Voici ce qui a fonctionné pour moi: NFS.

Les documents vagabonds disent:

Les dossiers NFS ne fonctionnent pas sur les hôtes Windows. Vagrant ignorera votre demande de synchronisation NFS les dossiers sous Windows.

Ce n'est plus vrai. Nous pouvons utiliser vagrant-winnfsd plugin de nos jours. C'est vraiment simple à installer:

  1. Exécuter vagrant plugin install vagrant-winnfsd
  2. Changement dans votre Vagrantfile: config.vm.synced_folder ".", "/vagrant", type: "nfs"
  3. ajouter à Vagrantfile: config.vm.network "private_network", type: "dhcp"

C'est tout ce dont j'avais besoin pour que NFS Fonctionne. Le temps de réponse de Laravel a diminué de 500ms à 100ms pour moi.

2
répondu frutality 2017-06-15 07:26:40

Laravel est lent, car dans la plupart des cas, L'utilisation de PHP pour les pages web est lente.

Avec Laravel, l'ensemble du framework est reconstruit à chaque invocation - c'est pourquoi toutes les pages pointent vers index.php. Puisque l'ensemble du framework est des scripts PHP, ils doivent tous passer par L'interpréteur PHP - à chaque fois. Plus le cadre est grand, plus cela prend de temps.

Contraste ceci avec un "environnement serveur" (par exemple tomcat) où le serveur exécute le code d'initialisation une fois, et éventuellement toutes les pages sera en code natif (après JIT).

Comme exemple de référence, en utilisant le même matériel, OS, etc. un simple "hello world" utilisant JSP sur ce matériel est 3000 rps, le même hello world sur laravel est 51 rps.

Le moyen le plus simple de tester la surcharge du framework, et le RPS maximum résultant par cœur, est D'utiliser Apache AB et une valeur de concurrence de 1, avec un simple "hello world" dynamique (pour éviter la mise en cache de page statique).

0
répondu robert engels 2018-07-23 22:20:47