J'ai examiné de près la consommation de mémoire Wordpress. Sur mon site, il semble que pour chaque page consultée, 20 Mo de RAM soient alloués, histoire de préparer un environnement confortable pour l'exécution de tous les plug-ins. Je l'ai tracé ainsi:
Il n'y a pas de point unique à optimiser, pas de méchant qui mange la plus grande partie de la mémoire. La consommation est répartie sur de nombreux modules php.
Comment faire en sorte que Wordpress initialise son environnement en mémoire une seule fois, puis le réutilise plusieurs fois pour chaque résultat? Je ne veux pas que PHP lent consomme 20 Mo à chaque clic d'utilisateur - même sur un serveur avec beaucoup de mémoire, il faut quelques secondes pour que tout ce travail soit effectué. Vous auriez essentiellement besoin de morceaux de mémoire en lecture seule pouvant être réutilisés.
Aussi ... pourquoi 20MB? Quelqu'un peut-il donner un aperçu de cela?
Edit: Voici la sortie WinCacheGrind sur le Wordpress en cours d’exécution sur ma machine de développement (beaucoup plus rapide que l’hébergement partagé). Comme vous pouvez le constater, il faut une seconde de travail pour produire le code HTML de la page principale. Ralentissez en hébergeant un hébergement partagé et vous aurez la recette du problème. J'ai choisi la méthode qui prend le plus de temps. Comment vous y prendriez-vous pour l'optimiser?
Edit: Voici les statistiques de requête de cet outil de profiling functions.php fantastique .
Chargement: 12 requêtes - 532ms - 19.1MB - 43 résultats de cache / 53 Requête: 15 requêtes - 563ms - 19.0Mo - 72 résultats de cache / 86 Afficher: 21 requêtes - 705ms - 19.2Mo - 234 résultats de cache / 257
Edit: Voulez-vous voir quelque chose qui va vous faire paniquer? Insérer ces lignes à la fin de index.php:
echo "<pre>\n";
print_r(get_defined_vars());
echo "</pre>\n";
J'ai essayé de compter combien de fois le corps de la publication actuelle est enregistré dans la mémoire. J'ai compté 20 instances. Ensuite, j'ai réalisé que PHP avait un comptage de références, alors le nombre de copies a été réduit à trois: deux semblent être dans WP_Query, un dans le cache d'objets. J'enquête plus loin.
C'est pourquoi je pense que WordPress a besoin d'un refactoring ciblant les problèmes de mémoire. Vous ne pouvez plus imputer sa consommation de mémoire à la complexité de son travail. Il fait simplement un tas de choses fausses .
Edit: Après une journée passée à essayer de comprendre cela, voici mes conclusions:
1) 88% de la mémoire totale provient d'appels de type require, include ou include_once:
2) Les fichiers php inclus se produisent principalement pendant la première partie du traitement d'une requête (ce qui n'est pas surprenant), c'est également l'endroit où toute la mémoire est consommée:
3) Il est assez intéressant de tracer toutes les fonctions en cours d'exécution lors d'une requête. Il y a plus de 12 000 appels au total. Je les ai secoués pour les rendre plus visibles (l'axe Level est essentiellement la profondeur de l'empilement):
4) Le seul moyen d'avancer auquel je puisse penser est de minimiser le nombre de fichiers .php inclus. Si je divise les fonctions par fichier, vous pouvez voir que de nombreux fichiers sont consultés une ou deux fois au plus. Nous avons besoin d'un moyen de les éviter quand ils ne sont pas nécessaires. Par exemple, mon plug-in de sauvegarde de base de données distante est chargé et enregistré, juste pour ne jamais être utilisé du tout. Voici le tracé ci-dessus divisé par nom de fichier:
J'offre une prime qui vaut toute ma réputation :) pour des modifications qui conduiraient à une réduction de 30% ou plus de la mémoire de mes blogs.
Edit: J'ai installé WP 3.1, voici une comparaison avec l'ancienne version.
Le bleu est WP 3.1, le rouge est 3.0.4. Le nouveau WP est plus rapide, mais consomme également plus de mémoire.
Voici une liste par fichier d'inclusion.
Cela me permet de réaliser à quel point "All In One SEO Pack" consomme de la mémoire - une solution serait d'utiliser une fraction des fonctionnalités du plugin pour obtenir ce que je veux. En outre, mes propres plugins semblent être assez mauvais.
Je voudrais essayer le chargement conditionnel, par exemple, comment.php (j'autorise les commentaires sur mon blog) et plusieurs autres. J'ai supprimé tout le code obsolète. J'ai réduit kses.php pour ne charger que ses tables globales à la demande. J'ai simplifié l10n (je ne fais pas de localisation), rendant ses fonctions renvoyer les chaînes immédiatement, sans recherches. Je suis encore loin des 30% que j'ai arbitrairement établis.
Edit: J'ai téléchargé et activé APC avec les paramètres par défaut (32 Mo de cache opcode). Voici la comparaison:
Vous pouvez voir que le chargement du code s’est considérablement accéléré et que le code prend moins de place en mémoire (probablement parce que nous ne traitons que des opcodes, pas de la source originale). La consommation de mémoire est cependant encore assez élevée.