Un site que j'ai construit avec Kohana a été critiqué avec une énorme quantité de trafic hier, ce qui m'a obligé à prendre du recul et à évaluer une partie de la conception. Je suis curieux de savoir quelles sont les techniques standard pour optimiser les applications basées sur Kohana?
Je suis également intéressé par l'analyse comparative. Dois-je configurer Benchmark::start()
et Benchmark::stop()
pour chaque méthode de contrôleur afin de voir les temps d'exécution pour toutes les pages, ou est-ce que je peux appliquer l'analyse comparative globalement et rapidement?
J'utiliserai davantage la bibliothèque Cache dans le temps à venir, mais je suis ouvert à plus de suggestions car je suis sûr que je peux faire beaucoup de choses dont je ne suis tout simplement pas au courant pour le moment.
Ce que je vais dire dans cette réponse n'est pas spécifique à Kohana, et peut probablement s'appliquer à beaucoup de PHP projets.
Voici quelques points qui me viennent à l'esprit lorsque l'on parle de performances, d'évolutivité, de PHP, ...
J'ai utilisé plusieurs de ces idées en travaillant sur plusieurs projets - et elles ont aidé; donc ils pourraient probablement aider ici aussi.
Tout d'abord, en matière de performances, il y a de nombreux aspects/questions à prendre en compte :
La première chose qui pourrait être vraiment utile est d'utiliser un proxy inverse , comme vernis, devant votre serveur web: laissez-le mettre en cache autant de choses que possible , donc uniquement les requêtes qui ont vraiment besoin de PHP/Calculs MySQL (et, bien sûr, quelques autres requêtes, quand elles ne sont pas dans le cache du proxy) le faire à Apache/PHP/MySQL.
À propos de utilisant un proxy inverse comme cache , pour une application PHP), vous pouvez, par exemple, jeter un œil at Les résultats de référence montrent une augmentation de 400% à 700% des capacités du serveur avec APC et Squid Cache.
(Oui, ils utilisent Squid, et je parlais de vernis - c'est juste une autre possibilité ^^ Le vernis étant plus récent, mais plus dédié à la mise en cache)
Si vous faites cela assez bien et que vous parvenez à arrêter de générer encore et encore trop de pages, peut-être que vous n'aurez même pas à optimiser votre code ;-)
Du moins, peut-être pas dans n'importe quel type de Rush ... Et il est toujours préférable d'effectuer des optimisations lorsque vous n'êtes pas sous trop de pression ...
En guise de remarque: vous dites dans le PO:
Un site que j'ai construit avec Kohana a été critiqué avec une énorme quantité de trafic hier,
C'est le genre de situation soudaine où un reverse-proxy peut littéralement sauver la journée , si votre site Web peut gérer le fait de ne pas être à jour à la seconde :
À propos de cela, Comment puis-je détecter et survivre à être "Slashdotted"? pourrait être une lecture intéressante.
Tout d'abord: utilisez-vous une version récente de PHP ? Il y a régulièrement des améliorations de vitesse, avec de nouvelles versions ;-)
Par exemple, jetez un œil à Benchmark of PHP Branches 3.0 à 5.3-CVS.
Notez que les performances sont une bonne raison d'utiliser PHP 5.3 ( j'ai fait quelques benchmarks (en français) , et les résultats sont excellents) ...
Une autre très bonne raison étant, bien sûr, que PHP 5.2 a atteint sa fin de vie, et n'est plus maintenu !
[apc.stat](https://php.net/manual/en/apc.configuration.php#ini.apc.stat)
peut être bon pour la charge du système; mais cela signifie que les modifications apportées aux PHP fichiers ne seront pas prises en compte à moins que vous ne vidiez tout l'opcode-cache; à ce sujet, pour plus de détails, voir par exemple To stat ( ) Ou ne pas statuer ()?Autant que possible, il vaut mieux éviter de refaire sans cesse la même chose .
La principale chose à laquelle je pense est, bien sûr, les requêtes SQL: beaucoup de vos pages font probablement les mêmes requêtes, et les résultats de certaines d'entre elles sont probablement presque toujours les mêmes ... Ce qui signifie beaucoup de "inutile" requêtes faites à la base de données, qui doit passer du temps à servir les mêmes données encore et encore.
Bien sûr, cela est vrai pour d'autres choses, comme les appels aux services Web, la récupération d'informations sur d'autres sites Web, les calculs lourds, ...
Il pourrait être très intéressant pour vous d'identifier:
Et stockez ces données/résultats dans une sorte de cache, afin qu'ils soient plus faciles à obtenir - plus rapide - et vous n'avez pas à vous rendre sur votre serveur SQL pour "rien".
Les grands mécanismes de mise en cache sont, par exemple:
Je suis presque sûr que votre framework contient des éléments liés au cache; vous savez probablement déjà que, comme vous l'avez dit "J'utiliserai la bibliothèque Cache plus à temps à venir" dans l'OP ;-)
Maintenant, une bonne chose à faire serait d'utiliser l'extension Xdebug au profil votre application : elle permet souvent de trouver assez facilement quelques points faibles - du moins, s'il y a une fonction qui prend beaucoup de temps.
Configuré correctement, il générera des fichiers de profilage pouvant être analysés avec certains outils graphiques, tels que:
Par exemple, voici quelques captures d'écran de KCacheGrind:
(source: Pascal-martin.fr )
(source: Pascal-martin.fr )
(BTW, le callgraph présenté sur la deuxième capture d'écran est généralement quelque chose que ni WinCacheGrind ni Webgrind ne peuvent faire, si je me souviens bien ^^)
(Merci @Mikushi pour le commentaire) Une autre possibilité que je n'ai pas beaucoup utilisée est le xhprof = extension: elle aide également au profilage, peut générer des callgraphs - mais est plus légère que Xdebug, ce qui signifie que vous devriez pouvoir l'installer sur un serveur de production.
Vous devriez pouvoir l'utiliser seul XHGui, ce qui aidera à la visualisation des données.
Maintenant que nous avons parlé un peu de PHP, notez qu'il est plus que possible que votre goulot d'étranglement ne soit pas le côté PHP des choses , mais la base de données un ...
Au moins deux ou trois choses, ici:
EXPLAIN
instruction, si vous utilisez MySQL log_slow_queries
pour obtenir une liste des requêtes qui prennent "trop" temps, et commencez votre optimisation par celles-ci.Pourtant, les deux choses les plus importantes sont:
Si vous lisez encore, qu'est-ce qui pourrait être optimisé?
Eh bien, il y a encore de la place pour des améliorations ... Quelques idées orientées architecture pourraient être:
Eh bien, peut-être que certaines de ces idées sont un peu exagérées dans votre situation ^^
Mais, quand même ... Pourquoi ne pas les étudier un peu, juste au cas où? ;-)
Votre question initiale portait sur l'optimisation d'une application qui utilise Kohana ... Eh bien, j'ai publié quelques idées qui sont vraies pour toute PHP application ... Ce qui signifie qu'ils sont également vrais pour Kohana ;-)
(Même si ce n'est pas spécifique ^^)
J'ai dit: utilisez le cache; Kohana semble prendre en charge certains mise en cache (Vous en avez parlé vous-même, donc rien de nouveau ici ...)
S'il y a quelque chose qui peut être fait rapidement, essayez-le ;-)
J'ai également dit que vous ne devriez rien faire qui ne soit pas nécessaire; y a-t-il quelque chose d'activé par défaut dans Kohana dont vous n'avez pas besoin?
En parcourant le net, il semble qu'il y ait au moins quelque chose à propos du filtrage XSS; avez-vous besoin de ça?
Pourtant, voici quelques liens qui pourraient être utiles:
Et, pour conclure, une simple pensée:
Je ne dis pas que vous ne devriez pas optimiser: vous devriez certainement!
Mais optez pour des optimisations "rapides" qui vous rapporteront d'abord de grosses récompenses : l'utilisation d'un cache d'opcode peut vous aider à obtenir entre 10 et 50 pour cent de réduction sur la charge CPU de votre serveur ... Et la configuration ne prend que quelques minutes ;-) De l'autre côté, passer 3 jours pour 2 pour cent ...
Oh, et, btw: avant de faire quoi que ce soit: mettre en place des éléments de surveillance , pour que vous sachiez quelles améliorations ont été apportées, et comment!
Sans surveillance, vous n'aurez aucune idée de l'effet de ce que vous avez fait ... Pas même si c'est une véritable optimisation ou pas!
Par exemple, vous pouvez utiliser quelque chose comme RRDtool + cactus.
Et montrer à votre patron des graphismes sympas avec une perte de charge CPU de 40% est toujours génial ;-)
Quoi qu'il en soit, et pour vraiment conclure: amusez-vous!
(Oui, l'optimisation est amusant!)
(Ergh, je ne pensais pas que j'écrirais autant ... J'espère qu'au moins certaines parties de ceci sont utiles ... Et je devrais me souvenir de cette réponse: cela pourrait être utile d'autres fois ...)
Utilisez XDebug et WinCacheGrind ou WebCacheGrind pour profiler et analyser l'exécution lente du code.
(source: jokke.dk )
Kohana est prêt à l'emploi très très rapide, sauf pour l'utilisation d'objets de base de données. Pour citer Zombor "Vous pouvez réduire l'utilisation de la mémoire en vous assurant que vous utilisez l'objet de résultat de la base de données au lieu des tableaux de résultats." Cela fait une énorme différence de performance sur un site qui est critiqué. Non seulement il utilise plus de mémoire, mais il ralentit l'exécution des scripts.
De plus, vous devez utiliser la mise en cache. Je préfère Memcache et l'utilise dans mes modèles comme ceci:
public function get($e_id)
{
$event_data = $this->cache->get('event_get_'.$e_id.Kohana::config('config.site_domain'));
if ($event_data === NULL)
{
$this->db_slave
->select('e_id,e_name')
->from('Events')
->where('e_id', $e_id);
$result = $this->db_slave->get();
$event_data = ($result->count() ==1)? $result->current() : FALSE;
$this->cache->set('event_get_'.$e_id.Kohana::config('config.site_domain'), $event_data, NULL, 300); // 5 minutes
}
return $event_data;
}
Cela augmentera également considérablement les performances. Les deux techniques ci-dessus ont amélioré les performances d'un site de 80%.
Si vous avez donné plus d'informations sur l'endroit où vous pensez que se trouve le goulot d'étranglement, je suis sûr que nous pourrions vous donner de meilleures idées.
Consultez également yslow (google it) pour d'autres conseils de performance.
Code de profil avec XDebug .
Utilisez beaucoup de mise en cache. Si vos pages sont relativement statiques, le proxy inverse peut être le meilleur moyen de le faire.
Strictement lié à Kohana (vous l'avez probablement déjà fait, ou pas):
En mode production:
Juste mes 2 cents :)
Je suis totalement d'accord avec les réponses XDebug et la mise en cache. Ne regardez pas dans la couche Kohana pour l'optimisation avant d'avoir identifié vos plus grands goulots d'étranglement de vitesse et d'échelle.
XDebug vous dira où vous passez le plus de temps et identifiera les "points chauds" dans votre code. Conservez ces informations de profilage afin de pouvoir référencer et mesurer les améliorations de performances.
Exemple de problème et de solution: Si vous constatez que vous créez à chaque fois des objets coûteux à partir de la base de données, qui ne changent pas vraiment souvent, vous pouvez envisager de les mettre en cache avec Memcached ou un autre mécanisme. Tous ces correctifs de performances prennent du temps et ajoutent de la complexité à votre système, alors assurez-vous de vos goulots d'étranglement avant de commencer à les corriger.