Augmenter la limite de mémoire n'aide pas en cas d'erreur fatale: taille de mémoire autorisée de… / modules / views / views.module sur la ligne 416

11

Je suis passé de Drupal 7.14 à 7.15 il y a trois semaines et, par conséquent, je rencontre une série d' erreurs de limite de mémoire très sophistiquées (pour moi) . Ces erreurs se produisent chaque fois que j'essaie d'effacer le cache des performances ou d'exécuter des scripts de mise à jour.

Ma société d'hébergement a augmenté ma limite de mémoire dans php.ini jusqu'à 126 M, 256 M, 512 M et même 1024 M. Mais les erreurs se produisent toujours. J'ai migré mon site de partagé à VPS, mais l'erreur se produit toujours incroyablement. Je n'ai aucun moyen et aucune idée de comment avancer.

Voici les erreurs:

  • Erreur fatale: taille de mémoire autorisée de 536870912 octets épuisée (tentative d'allocation de 30 octets) dans /home/example/public_html/sites/all/modules/views/views.module à la ligne 416
  • Erreur fatale: taille de mémoire autorisée de 536870912 octets épuisée (tentative d'allocation de 108 octets) dans /home/example/public_html/includes/menu.inc sur la ligne 2736

  • Erreur fatale: taille de mémoire autorisée de 536870912 octets épuisée (tentative d'allocation de 71 octets) dans /home/example/public_html/sites/all/modules/chain_menu_access/chain_menu_access.module à la ligne 59

  • allouer 64 octets) dans /home/example/public_html/sites/all/modules/views/includes/base.inc sur la ligne 93

salift
la source
Quel est votre trafic de pointe (pages / seconde). De plus, combien de données (nœuds?) La vue essaie-t-elle de récupérer?
cherouvim
discussion similaire sur drupal.org drupal.org/node/76156
Anoop Joseph
2
Avez-vous par hasard une vue qui renvoie un grand nombre de résultats et pour le formatage, elle charge le contenu au lieu des champs? J'ai vu cette performance gêner plusieurs fois auparavant.
Jepedo
Salut les gars! Merci beaucoup pour vos réponses. Je veux dire que le site Web est en mode maintenance et ne contient que peu de contenu (nœuds) à des fins de test. Le site est visité uniquement par les robots d'exploration Comme je l'ai mentionné dans mon article, l'augmentation de la limite de mémoire dans la solution php.ini suggérée dans le noeud drupal.org/node/76156 n'a pas aidé dans mon cas. Pour les vues chargeant du contenu au lieu du champ. Je veux comprendre comment
salift
1
Avez-vous essayé de revenir à Drupal 7.14? Si la mise à niveau vers Drupal 7.15 a causé ce problème, alors pourquoi ne pas essayer de revenir en arrière? Mon intuition est qu'il y a une récursion infinie dans l'un de vos modules. Quels sont vos modules liés à Views?
Johnathan Elmore

Réponses:

13

J'ai également frappé ma tête contre un mur la dernière fois avec des problèmes de mémoire Drupal. Voici mes connaissances recueillies sur le sujet:

1. Les vues (peuvent) utiliser beaucoup de mémoire

Je m'aime quelques vues (et Panels et CTools et tout ce que merlinofchaos touche avec ses doigts puissants et puissants), mais il est possible de créer des configurations avec des relations multiples qui utilisent beaucoup de mémoire. Si vous désactivez vos vues et que le problème de mémoire disparaît, c'est probablement une vue mal construite qui cause le problème.

Que faire s'il s'agit d'une vue et que vous avez vraiment besoin de cette vue pour fonctionner? Essayez de le mettre en code (via un exportateur en bloc ou des fonctionnalités; voir ci-dessous. J'ai une fonctionnalité similaire à celle des vues codée à la main afin d'améliorer les performances avec très peu de succès) pour commencer. Une autre pensée est de refaire la vue d'une manière différente - si finalement vous en êtes aux termes de taxonomie, assurez-vous que le type de vue est une vue de taxonomie lors de sa création; ne créez pas une vue de contenu qui utilise des relations pour obtenir des termes de taxonomie.

Il pourrait également être utile de mentionner ici que Panels utilise également soi-disant beaucoup de mémoire - je ne l'ai pas vraiment évalué, donc je ne peux pas le confirmer.

2. Le déplacement de trucs de la base de données dans le code est une très bonne pratique

Il m'a fallu plusieurs sites Drupal pour le réaliser, mais conserver tout ce qui est créé via une interface utilisateur dans la base de données (configurations Vues et Panneaux en particulier) est une pire pratique Drupal. Pourquoi? Il augmente la charge sur la base de données et ne peut pas être contrôlé par la version. Le premier point est particulièrement problématique en termes d'utilisation de la mémoire - au lieu de simplement charger le contenu de la vue depuis la base de données, le site doit également charger les composants de la vue lui-même. Ceci est exacerbé par la façon dont Drupal utilise les tables: en résumant tout au nième degré, chaque bit de la fonctionnalité de Drupal utilise une nouvelle table, ce qui entraîne certaines demandes joignant un bajillion de tables. Cela donne des hernies aux informaticiens (mise en garde: le lien est idiot), mais ne peut pas vraiment être évité avec un logiciel aussi modulaire et convivial que Drupal.

La solution? Utilisez Bulk Exporter (inclus avec CTools) ou Features pour empaqueter des bits de code résidant actuellement dans la base de données en tant que code de module.

3. Les thèmes peuvent aussi manger de la mémoire

Votre thème contient-il beaucoup de fichiers modèles (c'est-à-dire des fichiers dans le nom / modèles /)? Si tel est le cas, la mémoire est consommée à chaque fois qu'un de ces fichiers est chargé. Si vous créez des modèles spécifiquement pour empêcher l'affichage de bits de Drupal, essayez soit:

  1. Modification des autorisations afin que le bit n'apparaisse pas pour des rôles d'utilisateur non administrateur spécifiques.
  2. Utiliser CSS pour masquer des éléments.

Le premier choix est évidemment ce que vous voulez faire pour les choses affectant la sécurité - vous ne voulez pas utiliser CSS pour masquer un bouton "éditer" pour certains utilisateurs, seulement pour les avoir puis les afficher via Firebug ou autre.

4. N'allez pas trop loin sur les modules contrib

Alors que parfois un site a besoin de beaucoup de modules de contribution, n'allez pas trop loin. Chaque module activé (remarque: activé. Les modules désactivés n'utilisent aucune mémoire) utilise un module de mémoire. C'est un peu évident, mais mérite d'être noté malgré tout.

5. Le VPS est (parfois) un mensonge

D'après mon expérience, certaines sociétés d'hébergement sans scrupules aiment essayer de pousser des sites Drupal vers des serveurs VPS - ils sont plus chers et cela libère de l'espace d'hébergement partagé pour de plus en plus de sites WordPress. La situation est aggravée par le fait que les hébergeurs n'annoncent souvent pas (ou ne vous disent même pas volontiers si demandé) quelle est la limite de mémoire supérieure pour l'hébergement partagé.

Hélas, souvent si un site n'est pas sous un trafic intense et continue de planter, le problème a probablement plus à voir avec la configuration de Drupal qu'autre chose. Pousser un utilisateur vers VPS brouille simplement les eaux et ajoute plus de variables à gérer (Est-ce la configuration du serveur Web? La configuration PHP? La configuration invité VPS? La configuration hôte VPS, même?).

6. Lorsque tout le reste échoue, clonez vers localhost et battez-le avec un bâton

C'est une grande raison pour laquelle les gens utilisent la méthodologie de développement de production avec contrôle de version - lorsque tout le reste échoue, vous pouvez effectuer un vidage de base de données, git cloner le site sur un serveur de test local, puis gâcher royalement le site sur le tester le serveur sans se soucier de casser quoi que ce soit sur le serveur de production.

Pour les problèmes de mémoire, cela signifie généralement désactiver les modules un par un jusqu'à ce que celui à l'origine du problème soit exposé. Il peut également pointer vers des problèmes liés à l'hébergeur - si le site fonctionne parfaitement sur une installation locale avec une mémoire définie à quelque chose de raisonnable comme 128 Mo, alors vous savez que votre hébergeur est en panne.

tl; dr

Mon instinct est que c'est chain_menu_access qui cause le problème. Essayez de désactiver cela et de vider le cache, voyez si cela fonctionne.

J'ajouterai également à cette réponse en pensant à d'autres choses à essayer ...

aendrew
la source
... et c'est exactement le genre de chose que j'espérais quand j'ai mis une prime sur cette question! Surtout 2. 110 représentants à vous, bon monsieur :) J'espère que cela attirera des commentaires utiles d'autres personnes ayant des expériences légèrement différentes aussi
user56reinstatemonica8
ps J'ai entendu à divers endroits que même les modules désactivés utilisent une certaine quantité de mémoire pour analyser les fichiers. J'ai vu des gens dire que tous les fichiers php / inc étaient analysés d'une manière ou d'une autre, bien que cela ne semble pas correct (plus probablement uniquement les fichiers d'informations). Une idée s'il y a du vrai là-dedans?
user56reinstatemonica8
Cool merci! Je suis presque sûr que Drupal est assez consciencieux en mémoire lors du chargement de fichiers - si vous exécutez XHProf, le nombre d'appels pour file_scan_directoryutiliser suffisamment de mémoire tel quel. Je vais tester quelques trucs avec devel this après pour confirmer cela, cependant.
aendrew
Si les modules désactivés utilisent de la mémoire, c'est assez insignifiant. J'ai regardé la quantité de mémoire signalée par Devel avant et après la suppression d'un module - alors que l'actualisation de la page après la suppression des fichiers a montré un petit pic (<1 Mo), elle est ensuite revenue exactement aux valeurs de pré-suppression lors de l'actualisation suivante. Cela m'amène à croire que Drupal a. Analyse le répertoire des modules au démarrage pour voir s'il existe de nouveaux fichiers .info b. Ajoute les détails du module à sa systemtable c. Charge tous les modules dont les entrées de champ system.status sont définies sur 1. Si quelqu'un peut confirmer ou infirmer cela, je l'apprécierais.
aendrew
2

Vous pouvez essayer de mettre un profileur PHP comme XHProf ou le profileur intégré de Xdebug pour inspecter ce qui se passe dans la demande.

bmhaskar
la source
Une fois que vous avez déterminé quelles parties ont particulièrement besoin de la quantité de mémoire que vous avez faite à l'étape 1. L'étape 2 consiste à essayer de comprendre pourquoi elle utilise autant de mémoire et comment la réduire. Ci-dessus, les gens parlent de beaucoup d'éléments dans le résultat, etc. En général, c'est un processus qui ne peut pas être décrit simplement.
Daniel Wehner
1

Views est un porc de mémoire. La mise en cache de Drupal peut vous aider. Drupal ne charge les modules actifs que s'ils créent des tables ou ont d'autres objets qui peuvent traîner. Seule la désinstallation supprimera la plupart des artefacts. Nous utilisons les autorisations / autorisations de drupal et écrivons nos propres modules à l'intérieur. Pas le meilleur mais les performances sont bien meilleures et plus faciles à régler. Nous faisons de même pour WP.

CharlieH
la source
0

Dans mon cas, le problème de limite de mémoire a été généré par le système de cache (modules Boost et Boost Expire). Cela me donne un problème pour mettre à jour le module ou les vues. Une fois désactivés, les modules Boost fonctionnent correctement.

commodoreforce
la source