Écran blanc de la mort: erreur fatale: taille de mémoire autorisée de X octets épuisée

21

J'ai un problème avec mon installation Drupal, par exemple:

  • lorsque j'active ou désactive les modules, il me redirige vers une page vierge,
  • lorsque je crée un nouveau type de contenu et l'enregistre, me redirige vers une page vierge,
  • lorsque j'ajoute une nouvelle vue et l'enregistre, elle me redirige vers une page vierge,
  • lorsque j'essaie de vider le cache, il me redirige vers une page vierge,
  • ou dans des cas similaires.

Fondamentalement, toutes les pages de confirmation me redirigent vers un écran blanc. Lorsque je le rafraîchis à nouveau, il me montre la page. J'ai essayé d'augmenter la valeur de la mémoire PHP mais cela n'aide pas.

Y a-t-il d'autres solutions pour cela?

L'erreur que je rencontre:

Erreur fatale: taille de mémoire autorisée de 100663296 octets épuisée (tentative d'allocation de 8192 octets) dans les sites / tous / modules / vues / plugins / vues_plugin_localization_none.inc sur la ligne 1

Jayaram
la source
2
Vérifiez toujours les journaux d'erreurs, il aura toutes les informations nécessaires. On dirait que dans votre cas, vous manquez de mémoire. Drupal 7 nécessite plus de 32 Mo, ce que de nombreux fournisseurs d'hôtes la définissent par défaut.
GoodSp33d

Réponses:

20

Je sais que cela peut être en retard, mais cela m'a aidé. La plupart du temps, un module provoque WSOD, je ne pouvais pas simplement désactiver les modules pour tester ce que c'était, car j'ai peut-être perdu des données dans le processus. Ce que j'ai fait, c'était d'éditer temporairement cette fonction module.incdans le includesrépertoire principal

function module_invoke_all($hook) {
  $args = func_get_args();
  // Remove $hook from the arguments.
  unset($args[0]);
  $return = array();
  foreach (module_implements($hook) as $module) {

        print "Starting loading $module <br />";

        $function = $module . '_' . $hook;
        if (function_exists($function)) {
          $result = call_user_func_array($function, $args);
          if (isset($result) && is_array($result)) {
            $return = array_merge_recursive($return, $result);
          }
          elseif (isset($result)) {
            $return[] = $result;
          }
        }

        print "Finished loading $module <br />";

  }

  return $return;
}

Et j'ai ajouté ces 2 instructions d'impression dans le code ci-dessus, puis actualiser la page, le module qui n'a pas atteint l'instruction "Terminer le chargement de $ module" est celui qui a le problème ... il a été développé dans mon cas.

Après avoir trouvé le module, vous pouvez aller dans la table système et rechercher ce module, définir son état = 0 et bootstrap = 0 ou exécuter la requête:

UPDATE system SET status = 0, bootstrap = 0 WHERE name = 'module_name' LIMIT 1

Référence: débogage de Drupal White Screen of Death (WSOD)

Joshua Kissoon
la source
1
L'ajout des instructions d'impression à module_invoke_all m'a permis de trouver rapidement le module incriminé. Ensuite, j'ai utilisé drush pour le désactiver. Quelle bouée de sauvetage!
Dan Meigs
Vous êtes les bienvenus @DanMeigs. J'ai utilisé cette méthode seulement aujourd'hui pour réparer mon blog cleverlogic.net . Je devrais peut-être écrire un article à ce sujet, car j'en ai certainement lu beaucoup pendant que j'essayais de réparer le WSOD
Joshua Kissoon
11

Collez ce code dans votre index.phpfichier. Il vous montrera le message d'erreur au lieu d'une page vierge. On peut au moins connaître la racine du problème. Collez-le juste après la balise php.

    error_reporting(E_ALL);
    ini_set('display_errors', TRUE);
    ini_set('display_startup_errors', TRUE);

J'espère que cela vous montrera le chemin !.

http://drupal.org/node/158043

Sandesh Yadav
la source
1
Cela n'a pas fonctionné, j'ai essayé hier pour voir les erreurs, mais cela n'imprime rien
Jayaram
3
Avez-vous vérifié votre journal des erreurs? Si vous utilisez Apache sous Linux, essayez cette commande dans le terminal: tail /var/log/apache2/error.log. Cela vous montrera les 10 lignes les plus récentes de ce fichier.
Charlie Schliesser
En fait, il a commencé à me montrer les erreurs. L'erreur que j'obtiens est Erreur fatale: la taille de la mémoire autorisée de 100663296 octets est épuisée (a tenté d'allouer 8192 octets) dans *** / sites / all / modules / views / plugins / views_plugin_localization_none.inc sur la ligne 1
Jayaram
1
L'ajouter à index.phpest une mauvaise idée (même temporaire, car la plupart des gens sont trop paresseux pour le supprimer plus tard si cela fonctionne), il est préférable de le coller directement dans votre fichier de paramètres.
kenorb
10

La raison de l'écran blanc de décès est que le rapport d'erreur est désactivé, pour vérifier l'erreur, ajoutez les lignes suivantes dans votre fichier setting.php:

error_reporting(E_ALL);
$conf['error_level'] = 2;
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

Pour l'erreur que vous rencontrez ("Taille de mémoire autorisée de XXX octets épuisée"), vous pouvez essayer les choses suivantes:

  1. Tronquez le cache manuellement et vérifiez s'il résout le problème (il est probablement utile de sauvegarder votre base de données avant de le faire):

    Access phpMyAdmin and truncate all tables starting by cache_ from the database.

  2. Augmentez la limite de mémoire (car la principale raison de l'erreur ci-dessus est la mémoire épuisée par le serveur qui a provoqué le chargement partiel des modules et qui cause le problème) en ajoutant la ligne suivante dans votre fichier settings.php: l' ini_set('memory_limit', '-1');
    ajout ini_set('memory_limit', '-1'); remplace la limite de mémoire PHP par défaut.
    Si vous souhaitez restreindre la mémoire au lieu de, -1vous pouvez fournir une taille de mémoire comme «256M» OU «512M».

Ankit Agrawal
la source
6

Il se pourrait très bien que l'un de vos modules manque de mémoire.

Vous pouvez ajouter une ligne de code à votre fichier index.php pour permettre à Drupal de fonctionner avec plus de mémoire que le paramètre par défaut:

ini_set('memory_limit','256M');

Ajoutez le code ci-dessus sur la ligne après le? Php dans votre fichier /drupal/index.php. Si tout commence à bien fonctionner, vous pouvez identifier la cause du problème de mémoire (il s'agit très probablement d'un module).

Désactivez un module, puis commentez l'ini_set ('memory_limit', '256M'); et voyez s'il se charge maintenant.

Il n'est pas recommandé de quitter l'ini_set ('memory_limit', '256M'); en place comme solution, mais cela peut au moins vous permettre d'accéder à la page de liste de vos modules.

Vous pouvez trouver utile de faire un debug_backtrace () pour déterminer ce qui utilisait la mémoire.

Johnathan Elmore
la source
Cela n'a pas aidé
Jayaram
De plus, je peux voir la page de liste des modules, cela ne se produit que lorsque j'active / désactive les modules, je devrais le rafraîchir à nouveau pour voir la page de confirmation.
Jayaram
2
Plutôt que de placer les appels ini_set () dans index.php, où ils seront effacés lors d'une mise à jour, si vous devez les coder en PHP, vous devez les mettre dans votre fichier settings.php, qui est le bon endroit pour un site spécifique remplace.
Alfred Armstrong
L'ajouter à index.phpest une mauvaise idée (même temporaire, car la plupart des gens sont trop paresseux pour le supprimer plus tard si cela fonctionne), il est préférable de le coller directement dans votre fichier de paramètres.
kenorb
6

L'erreur:

Erreur fatale: taille de mémoire autorisée de X octets épuisée (tentative d'allocation de Y octets)

Pour convertir les octets X en Mo, divisez par 1024 * 1024 ou consultez Wolfram .

se produit lorsque PHP essaie d'allouer Y octets, mais il y a une limite stricte sur X octets définie par memory_limitles paramètres de configuration PHP .

La limite actuelle peut être vérifiée en allant dans Administration »Rapports» Rapport d'état »PHP (URL:) /admin/reports/status/phpou en imprimant ini_get('memory_limit')en PHP (notez que la limite peut être différente pour l'interface utilisateur et la CLI).

Pour y remédier, vous devez réduire votre utilisation des ressources, par exemple:

  • désactiver tous les modules de développement que vous n'utilisez pas actuellement (recommandé),

    Cela comprend: Devel, Devel Themer (si activé).

  • désactiver tous les modules que vous n'utilisez pas,

  • désactiver certaines variables de débogage qui peuvent avoir un impact sur vos ressources mémoire, par exemple quelques exemples avec drush:

    drush -y vset rules_debug 0
    drush -y vset rules_debug_log 0
  • désactiver certaines extensions PHP, telles que XDebug,

  • activer les caches redis / memcached et certains caches PHP (par exemple OPCache / XCache),
  • enfin si ci-dessus ne vous aidera pas - augmentez memory_limitvotre configuration PHP .

Si vous décidez d'augmenter la limite de mémoire, beaucoup de gens ici conseillent de réellement pirater votre cœur en collant le code PHP dans votre index.phppour augmenter votre mémoire PHP - ne faites jamais ça ! C'est une très mauvaise pratique.

Modifiez plutôt votre settings.php(ou settings.local.phpsi vous l'avez inclus) et collez le code suivant à la fin:

ini_set('memory_limit', '512M');

ou une meilleure façon de le faire est d'éditer votre fichier de configuration PHP ( php.ini) et de changer la ligne suivante:

memory_limit = 512M  ; Maximum amount of memory a script may consume

Si vous ne savez pas où est votre php.ini, vérifiez par:

  • drush status commander
  • ou en allant à /admin/reports/status/php.

Pour étudier plus en détail les pages / composants qui utilisent le plus de mémoire, vous disposez des possibilités suivantes:

Pour plus d'informations, consultez:

kenorb
la source
1
+1 pour souligner que php UI et CLI peuvent avoir différents memory_limit. J'ai eu le problème signalé uniquement avec drushexactement parce que j'avais une erreur dans /etc/php/7.0/cli/php.inimais pas dans /etc/php/7.0/cli/php.ini, donc l'interface utilisateur drupal fonctionnait bien. Merci!
miro marchi
1

Vous pouvez utiliser un module pour contrôler cette limite de mémoire. Le module PHP Runtime Configurator fournit de nombreuses options pour configurer sans modifier votre fichier php.ini et redémarrer Apache.

Vous pouvez configurer les paramètres suivants:

  • Limite de téléchargement de fichiers
  • Limite de mémoire
  • Délai d'exécution maximal
  • Limite variable d'entrée maximale

Sahil Gupta
la source