2014-05-03 4 views
0

Nous courons une application basée sur le Web MySQL/PHP codé en Laravel. Fondamentalement, nous l'utilisons pour gérer les travaux de service/les ordres de travail dans un atelier de réparation d'ordinateurs. Nous avons près de 2 500 ordres de travail et il est parfois un peu lent, surtout lorsque plusieurs techniciens entrent ou mettent à jour des ordres de travail. Quelles sont les meilleures façons de le rendre plus rapide et de travailler plus efficacement, surtout que nous continuons à ajouter des clients et des ordres de travail. Le serveur fonctionne avec CentOS 6 x64, cPanel, Intel Xeon E3 et 2x Enterprise SATA dans Linux Software RAID1. Merci!Évolutivité de Laravel Web App

+1

Quel est le goulot d'étranglement? –

+0

Merci d'avoir posé cette question. Je suppose que MySQL est le goulot d'étranglement parce que ce serveur gère un tas de compte d'hébergement Web partagé à une charge de 0,13. J'essaie de réduire les disques parce que je pense que c'est le problème. –

+0

Mieux vaut mesurer que supposer, mais vous pouvez essayer un cache en mémoire comme [memcached] (http://laravel.com/docs/cache). SO n'est pas vraiment le bon endroit pour cela, mais les mesures peuvent nous aider à vous diriger vers un site plus pertinent dans le réseau StackExchange. –

Répondre

5

Je ne sais pas à quelle profondeur une réponse peut aller en spécifiant une solution, mais il beaucoup de meilleures pratiques à suivre. Je suppose que c'est ce que vous recherchez, car vous n'avez pas précisé de goulots d'étranglement particuliers.

Quelques conseils rapides seraient à

  • Cache vos requêtes:

Donc, s'il y a une course de requête sur votre application, pour laquelle les données ne sont mis à jour tous les x jours, pourquoi ne pas mettre en cache les pour x jours afin que votre db enregistre d'être frappé inutilement entre les deux? Exemple du docs:

$value = Cache::remember('users', $minutes, function() 
{ 
    return DB::table('users')->get(); 
}); 
  • Faire usage de files d'attente:

Il peut être le cas que les tâches de fond sont en cours d'exécution lorsqu'un utilisateur, par exemple, de l'ordre de travail mis à jour (courriels, appelant autre logique) qui peut prendre un certain temps et oblige cet utilisateur à attendre. Au lieu d'exécuter ces tâches à ce moment-là et de ralentir les choses pour l'utilisateur, vous pouvez les mettre en file d'attente pour les exécuter ultérieurement. Laravel supports de nombreux pilotes de file d'attente différents à cette fin. J'ai personnellement utilisé Beanstalk mais vous pouvez aussi essayer quelque chose comme IronMQ.

Utilisation de base avec Beanstalk: changer /app/config/queue.php pour spécifier votre pilote de file d'attente par défaut et toute configuration, y compris le nom d'une file d'attente:

'default' => 'beanstalkd', 


'beanstalkd' => array(
     'driver' => 'beanstalkd', 
     'host' => 'localhost', 
     'queue' => array('default','SendEmail'), 
    ), 

Ensuite, dans votre contrôleur, vous pourriez procédez comme suit pour pousser à cette file d'attente:

Queue::push('SendEmail', array('message' => 'Something...')); 

pour votre information, Fideloper a une excellente tutorial à ce sujet.

  • Méfiez-vous des n + 1 problème et utiliser le chargement impatient:

Le docs expliquent cette question.

  • Envisager de passer à une base de données NoSQL comme MongoDB (dépend entièrement des exigences):

Comme je l'ai mentionné, cela dépend entièrement de votre application et ce que vous faites, mais en utilisant une base de données NoSQL sur MySQL a ses mérites dans certains cas. Vous pouvez utiliser sharding et la réplication pour aider à la mise à l'échelle de votre application avec MongoDB mais bien sûr ne sont pas limités à mongo seul.

Il y a beaucoup d'autres choses que vous pouvez faire, mais avec les conseils ci-dessus, je pense que vous pourriez rendre votre application beaucoup plus rapide et efficace.

+0

Ceci est une excellente réponse. Je vais transmettre cela au développeur. Merci beaucoup! –

0

Assurez-vous également que vos tables les plus utilisées sont Innodb et non MyIsam pour éviter le verrouillage de la table.

Pour la table MyIsam lorsqu'une ligne est insérée ou mise à jour, toutes les autres modifications de cette table sont conservées jusqu'à ce que cette demande soit terminée.