Erreur PHP Fatal error: Allowed memory size of ... bytes exhausted

WRInaute impliqué
Bonjour,

il m'arrive de recevoir des messages d'erreurs en provenance de mon hébergement et elles sont toutes de se style : "PHP Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 130968 bytes)"

La ligne de ce genre de message se poursuit en indiquant le chemin et le numéro de la ligne où se trouverait cette erreur.

Disons, que je ne sais pas interpréter ce genre de messages de Allowed memory size.

Dois-je m'en inquiéter ou est-ce que finalement ça n'a rien de grave ?
Ce genre de message arrive alors que je ne suis pas intervenu sur le site pour changer quoi que ce soit.

Bon week-end.
 
WRInaute discret
Bonjour,
Je pense qu'il s'agit d'une question de mémoire.. Aurais-tu trop de plugins sur ton site ? ou bien ce sont les serveurs de ton hébergeur qui sont saturés (je ne sais pas qui est ton hébergeur) ? Je ne sais pas si c'est grave, en fait je ne sais pas grand chose :rolleyes: mais les pros vont arriver !
 
WRInaute passionné
Wow 512 Mo autorisés dans la configuration pour l'exécution d'un script, c'est énorme, en général on met beaucoup moins.
Et sans savoir ce que fait le script, difficile de deviner pourquoi il prend autant de mémoire. Est-ce un upload de fichier ?
 
WRInaute occasionnel
comme on dit : "google is your friend"
https://stackoverflow.com/questions...-of-134217728-bytes-exhausted-codeigniter-xml
l'erreur en elle même ne nous apprend pas grand chose, il faut regarder si ça plante une page complète ou une zone dans une page..
Si c'est une zone voir le plugin
Si c'est un truc de mémoire, il y a 2 options.
Soit c'est un mauvais paramétrage et le site crashe quand il y a trop de trafic (quand on a ça c'est qu'il y a malversations parce que un site à 10 visiteurs par jour, au lendemain il n'a pas 50000 visiteurs...)
Soit trop de données (on bourre trop une base de données avec un machin ma programmé)

Et aussi majoritairement, des débordements dans du code programmé et mal testé (ce qui rejoint le nombre des données qui devient trop important pour la taille du type (et comme en php on fait n'importe quoi avec les variables et les types, c'est très facile à faire exploser)
 
WRInaute impliqué
Merci pour vos réponses.
Bon, j'en sais un peu plus mais ça m'avance guère ne sachant pas où chercher.
Quand je regarde ma boutique internet tout semble être normal, mais je n'ouvre pas toutes les pages.

J'en parlerai à mon développeur et accessoirement à mon hébergeur.
 
WRInaute occasionnel
le développeur le sait, il espérait que personne ne le voit
l'hébergeur il s'en moque, c'est la faute du développeur, ce n'est pas son métier de faire fonctionner un site
la seule solution : lire les forums. Et dans les forums il n'y a jamais de solutions
Améliores tes H1 ils ne sont pas optimisés :);):mad::confused::cool::p:D:eek::oops::rolleyes:o_O:);):(:mad::confused::cool::p:D:eek::oops:o_O:oops::eek::mad::(:):cool:(je pnse qu'on va supprimmer mon post je suis sous surveillance, je vais faire une site avec les copies d'écrans de tous m"es posts supprimées)

sinon il faut reproduire l'erreur (et accessoirement l'envoyer au développeur).
Si on sait reproduire l'erreur, sur la tâche de résolution: on a fait 99% de la solution
 
Dernière édition:
WRInaute impliqué
J'ai pu ouvrir le script PHP concerné mais les lignes ne sont pas numérotées.
J'ai besoin de trouver la ligne 13
Sans numérotation, je dois compter chaque ligne ?

ça commence par :

<?php, ça compte pour 1 ?
 
WRInaute accro
Bonjour zikeur54

Oui çà compte pour 1.

Quant aux 512Mo du memory_limit celà me semble correct.

J'ai eu ce message quand j'ai refait ma bdd à partir de celle de mon site partenaire, mais le script a fonctionné sans interruption pendant 5 jours.

Amicalement.
 
WRInaute passionné
Utilise un éditeur spécialisé dans la programmation comme NotePad++ : la numérotation des lignes est présente et les mots-clés du langage détecté sont mis en surbrillance.

Est-ce que le site est sur un hébergement mutualisé (si oui, ces erreurs devraient survenir au moment des heures de pointe d'Internet) ou sur un serveur dédié (dans ce cas, il est mal configuré)?
 
WRInaute impliqué
Merci à @ortolojf et surtout à @anemone-clown .

Le site est bien en hébergement mutualisé. Donc si c'est "la faute" de mon hébergeur, je ne peux rien y faire et du coup, lors que je reçois ces messages d'erreurs, je ne m'inquiète pas inutilement.

Le script php que j'ai copié sur mon bloc note génère des espaces vides, pour trouver la ligne 13 est-ce que je dois compter un espace vide comme un numéro ?

Si je colle ici les premières lignes du code, pouvez-vous me signaler la ligne 13 ?

Je tente le coup. (ce n'est pas le script php complet)

<? php

fonction catalog_category_trail ($ category_id = 0, $ language_code = '') {

if (vide ($ language_code)) $ language_code = language :: $ selected ['code'];

$ trail = array ();

if (vide ($ category_id)) $ category_id = 0;

$ categories_query = database :: query (
"sélectionnez c.id, c.parent_id, ci.name
à partir de ". DB_TABLE_CATEGORIES." c
rejoindre à gauche ". DB_TABLE_CATEGORIES_INFO." ci on (ci.category_id = c.id et ci.language_code = '". database :: input ($ language_code)."')
où c.id = '". (int) $ category_id."'
limite 1; "
)
$ category = database :: fetch ($ categories_query);

if (! empty ($ category ['parent_id']))) {
$ trail = functions :: catalog_category_trail ($ category ['parent_id']);
$ trail [$ category ['id']] = $ category ['name'];
} else if (isset ($ category ['id'])) {
$ trail = array ($ category ['id'] => $ category ['name']);
}

return $ trail;
}

fonction catalog_category_descendants ($ category_id = 0, $ language_code = '') {

if (vide ($ language_code)) $ language_code = language :: $ selected ['code'];

$ sous-catégories = array ();

if (vide ($ category_id)) $ category_id = 0;

$ categories_query = database :: query (
"sélectionnez c.id, c.parent_id, ci.name
à partir de ". DB_TABLE_CATEGORIES." c
rejoindre à gauche ". DB_TABLE_CATEGORIES_INFO." ci on (ci.category_id = c.id et ci.language_code = '". database :: input ($ language_code)."')
où c.parent_id = '". (int) $ category_id."';
 
WRInaute accro
Bonjour zikeur54

$ categories_query = database :: query (
"sélectionnez c.id, c.parent_id, ci.name
à partir de ". DB_TABLE_CATEGORIES." c
rejoindre à gauche ". DB_TABLE_CATEGORIES_INFO." ci on (ci.category_id = c.id et ci.language_code = '". database :: input ($ language_code)."')
où c.parent_id = '". (int) $ category_id."';

Est équivalent ( en MySQL ) à :

SELECT c.id, c.parent_id, ci.name FROM DB_TABLE_CATEGORIES AS c LEFT JOIN
DB_TABLE_CATEGORIES_INFO AS ci ON ci.category_id = c.id WHERE ci.language_code = '". database :: input ($ language_code)."'

1) Il faut une foreign key ( clé étrangère ), de DB_TABLE_CATEGORIES ( colonne id ), vers DB_TABLE_CATEGORIES_INFO ( colonne category_id ).

2) Il est préférable aussi, que la colonne id soit une PRIMARY KEY ou un index unique.

3) Il faut que category_id soit indexée aussi.

Dispos pour plus d'informations.

Amicalement.
 
WRInaute accro
C'est quoi cette mise en forme de code foireuse, c'est encore pire que du WP ? o_O
On dirait que tu l'as passé dans un traducteur ? select => sélectionner, or => où, ...

Si tu veux vraiment analyser, il faut utiliser XDebug.
 
Dernière édition:
WRInaute impliqué
Voilà, disons que c'est plus propre maintenant. Je viens d'insérer mon script php en utilisant la balise de code approprié.
func_catalog.inc.php
C'est mieux pour vous ?
PHP:
<?php

  function catalog_category_trail($category_id=0, $language_code='') {

    if (empty($language_code)) $language_code = language::$selected['code'];

    $trail = array();

    if (empty($category_id)) $category_id = 0;

    $categories_query = database::query(
      "select c.id, c.parent_id, ci.name
      from ". DB_TABLE_CATEGORIES ." c
      left join ". DB_TABLE_CATEGORIES_INFO ." ci on (ci.category_id = c.id and ci.language_code = '". database::input($language_code) ."')
      where c.id = '". (int)$category_id ."'
      limit 1;"
    );
    $category = database::fetch($categories_query);

    if (!empty($category['parent_id'])) {
      $trail = functions::catalog_category_trail($category['parent_id']);
      $trail[$category['id']] = $category['name'];
    } else if (isset($category['id'])) {
      $trail = array($category['id'] => $category['name']);
    }

    return $trail;
  }

  function catalog_category_descendants($category_id=0, $language_code='') {

    if (empty($language_code)) $language_code = language::$selected['code'];

    $subcategories = array();

    if (empty($category_id)) $category_id = 0;

    $categories_query = database::query(
      "select c.id, c.parent_id, ci.name
      from ". DB_TABLE_CATEGORIES ." c
      left join ". DB_TABLE_CATEGORIES_INFO ." ci on (ci.category_id = c.id and ci.language_code = '". database::input($language_code) ."')
      where c.parent_id = '". (int)$category_id ."';"
    );
    while ($category = database::fetch($categories_query)) {
      $subcategories[$category['id']] = $category['name'];
      $subcategories = $subcategories + catalog_category_descendants($category['id'], $language_code);
    }

    return $subcategories;
  }

  function catalog_categories_query($parent_id=0, $dock=null) {

    $categories_query = database::query(
      "select c.id, c.image, ci.name, ci.short_description, c.date_updated from ". DB_TABLE_CATEGORIES ." c
      left join ". DB_TABLE_CATEGORIES_INFO ." ci on (ci.category_id = c.id and ci.language_code = '". database::input(language::$selected['code']) ."')
      where c.status
      and c.parent_id = '". (int)$parent_id ."'
      ". (!empty($dock) ? "and find_in_set('". database::input($dock) ."', c.dock)" : null) ."
      order by c.priority asc, ci.name asc;"
    );

    return $categories_query;
  }

  function catalog_products_query($filter=array()) {

    if (!is_array($filter)) trigger_error('Invalid array filter for products query', E_USER_ERROR);

    if (empty($filter['categories'])) $filter['categories'] = array();
    if (empty($filter['manufacturers'])) $filter['manufacturers'] = array();
    if (empty($filter['product_groups'])) $filter['product_groups'] = array();

    if (!empty($filter['category_id'])) $filter['categories'][] = $filter['category_id'];
    if (!empty($filter['manufacturer_id'])) $filter['manufacturers'][] = $filter['manufacturer_id'];
    if (!empty($filter['product_group_id'])) $filter['product_groups'][] = $filter['product_group_id'];

    $filter['categories'] = array_filter($filter['categories']);
    $filter['manufacturers'] = array_filter($filter['manufacturers']);
    $filter['product_groups'] = array_filter($filter['product_groups']);

    if (empty($filter['sort'])) $filter['sort'] = 'popularity';

    switch ($filter['sort']) {
      case 'name':
        $sql_inner_sort = "";
        $sql_outer_sort = "order by name asc";
        break;
      case 'price':
        $sql_inner_sort = "";
        $sql_outer_sort = "order by final_price asc";
        break;
      case 'date':
        $sql_inner_sort = "order by p.date_created desc";
        $sql_outer_sort = "order by p.date_created desc";
        break;
      case 'occurrences':
        $sql_inner_sort = "";
        $sql_outer_sort = "order by occurrences desc";
        break;
      case 'rand':
        $sql_inner_sort = "";
        $sql_outer_sort = "order by rand()";
        break;
      case 'popularity':
      default:
        $sql_inner_sort = "order by (p.purchases / (datediff(now(), p.date_created)/7)) desc, (p.views / (datediff(now(), p.date_created)/7)) desc";
        $sql_outer_sort = "order by (p.purchases / (datediff(now(), p.date_created)/7)) desc, (p.views / (datediff(now(), p.date_created)/7)) desc";
        break;
    }

    if (!empty($filter['exclude_products']) && !is_array($filter['exclude_products'])) $filter['exclude_products'] = array($filter['exclude_products']);

    $sql_andor = "and";

  // Define match points
    if ($filter['sort'] == 'occurrences') {
      $sql_select_occurrences = "(0
        ". (!empty($filter['product_name']) ? "+ if(pi.name like '%". database::input($filter['product_name']) ."%', 1, 0)" : false) ."
        ". (!empty($filter['sql_where']) ? "+ if(". $filter['sql_where'] .", 1, 0)" : false) ."
        ". (!empty($filter['categories']) ? "+ if(find_in_set('". implode("', categories), 1, 0) + if(find_in_set('", database::input($filter['categories'])) ."', categories), 1, 0)" : false) ."
        ". (!empty($filter['keywords']) ? "+ if(find_in_set('". implode("', p.keywords), 1, 0) + if(find_in_set('", database::input($filter['keywords'])) ."', p.keywords), 1, 0)" : false) ."
        ". (!empty($filter['manufacturers']) ? "+ if(p.manufacturer_id and p.manufacturer_id in ('". implode("', '", database::input($filter['manufacturers'])) ."'), 1, 0)" : false) ."
        ". (!empty($filter['product_groups']) ? "+ if(find_in_set('". implode("', p.product_groups), 1, 0) + if(find_in_set('", database::input($filter['product_groups'])) ."', p.product_groups), 1, 0)" : false) ."
        ". (!empty($filter['products']) ? "+ if(p.id in ('". implode("', '", database::input($filter['products'])) ."'), 1, 0)" : false) ."
      ) as occurrences";
      $sql_andor = "or";
    }

  // Create levels of product groups
    $sql_where_product_groups = "";
    if (!empty($filter['product_groups'])) {
      $product_groups = array();
      foreach ($filter['product_groups'] as $group_value) {
        list($group,) = explode('-', $group_value);
        $product_groups[$group][] = $group_value;
      }
      foreach ($product_groups as $group_value) {
        $sql_where_product_groups .= "$sql_andor (find_in_set('". implode("', product_groups) or find_in_set('", $group_value) ."', product_groups))";
      }
    }

    $sql_where_prices = "";
    if (!empty($filter['price_ranges'])) {
      foreach ($filter['price_ranges'] as $price_range) {
        list($min,$max) = explode('-', $price_range);
        $sql_where_prices .= " or (if(pc.campaign_price, pc.campaign_price, pp.price) >= ". (float)$min ." and if(pc.campaign_price, pc.campaign_price, pp.price) <= ". (float)$max .")";
      }
      $sql_where_prices = "$sql_andor (". ltrim($sql_where_prices, " or ") .")";
    }

    $sql_price_column = "if(pp.`". database::input(currency::$selected['code']) ."`, pp.`". database::input(currency::$selected['code']) ."` / ". (float)currency::$selected['value'] .", pp.`". database::input(settings::get('store_currency_code')) ."`)";

    $query = "
      select p.*, pi.name, pi.short_description, m.name as manufacturer_name, ". $sql_price_column ." as price, pc.campaign_price, if(pc.campaign_price, pc.campaign_price, if(pc.campaign_price, pc.campaign_price, ". $sql_price_column .")) as final_price". (($filter['sort'] == 'occurrences') ? ", " . $sql_select_occurrences : false) ." from (
        select p.id, p.code, p.manufacturer_id, group_concat(ptc.category_id separator ',') as categories, p.keywords, p.product_groups, p.image, p.tax_class_id, p.quantity, p.views, p.purchases, p.date_created
        from ". DB_TABLE_PRODUCTS ." p
        left join ". DB_TABLE_PRODUCTS_TO_CATEGORIES ." ptc on (p.id = ptc.product_id)
        where p.status
          and (id
          ". (!empty($filter['products']) ? "$sql_andor p.id in ('". implode("', '", database::input($filter['products'])) ."')" : false) ."
          ". (!empty($filter['categories']) ? "$sql_andor ptc.category_id in (". implode(",", database::input($filter['categories'])) .")" : false) ."
          ". (!empty($filter['manufacturers']) ? "$sql_andor manufacturer_id in ('". implode("', '", database::input($filter['manufacturers'])) ."')" : false) ."
          ". (!empty($filter['keywords']) ? "$sql_andor (find_in_set('". implode("', p.keywords) or find_in_set('", database::input($filter['keywords'])) ."', p.keywords))" : false) ."
          ". (!empty($sql_where_product_groups) ? $sql_where_product_groups : false) ."
          ". (!empty($filter['purchased']) ? "$sql_andor p.purchases" : false) ."
        )
        and (p.date_valid_from <= '". date('Y-m-d H:i:s') ."')
        and (year(p.date_valid_to) < '1971' or p.date_valid_to >= '". date('Y-m-d H:i:s') ."')
        ". (!empty($filter['exclude_products']) ? "and p.id not in ('". implode("', '", $filter['exclude_products']) ."')" : false) ."
        group by ptc.product_id
        ". ((!empty($sql_inner_sort) && !empty($filter['limit'])) ? $sql_inner_sort : '') ."
        ". ((!empty($filter['limit']) && empty($filter['sql_where']) && empty($filter['product_name']) && empty($filter['product_name']) && empty($filter['campaign']) && empty($sql_where_prices)) ? "limit ". (!empty($filter['offset']) ? (int)$filter['offset'] . ", " : false) ."". (int)$filter['limit'] : "") ."
      ) p
      left join ". DB_TABLE_PRODUCTS_INFO ." pi on (pi.product_id = p.id and pi.language_code = '". language::$selected['code'] ."')
      left join ". DB_TABLE_MANUFACTURERS ." m on (m.id = p.manufacturer_id)
      left join ". DB_TABLE_PRODUCTS_PRICES ." pp on (pp.product_id = p.id)
      left join (
        select product_id, if(`". database::input(currency::$selected['code']) ."`, `". database::input(currency::$selected['code']) ."` / ". (float)currency::$selected['value'] .", `". database::input(settings::get('store_currency_code')) ."`) as campaign_price
        from ". DB_TABLE_PRODUCTS_CAMPAIGNS ."
        where (start_date <= '". date('Y-m-d H:i:s') ."')
        and (year(end_date) < '1971' or end_date >= '". date('Y-m-d H:i:s') ."')
        order by end_date asc
      ) pc on (pc.product_id = p.id)
      where (p.id
        ". (!empty($filter['sql_where']) ? "$sql_andor (". $filter['sql_where'] .")" : false) ."
        ". (!empty($filter['product_name']) ? "$sql_andor pi.name like '%". database::input($filter['product_name']) ."%'" : false) ."
        ". (!empty($filter['campaign']) ? "$sql_andor campaign_price > 0" : false) ."
        ". (!empty($sql_where_prices) ? $sql_where_prices : false) ."
      )
      ". $sql_outer_sort ."
      ". (!empty($filter['limit']) && (!empty($filter['sql_where']) || !empty($filter['product_name']) || !empty($filter['campaign']) || !empty($sql_where_prices)) ? "limit ". (!empty($filter['offset']) ? (int)$filter['offset'] . ", " : false) ."". (int)$filter['limit'] : false) .";
    ";

    $products_query = database::query($query);

    return $products_query;
  }

  function catalog_stock_adjust($product_id, $option_stock_combination, $quantity) {

    if (empty($product_id)) return;

    if (!empty($option_stock_combination)) {
      $products_options_stock_query = database::query(
        "select id from ". DB_TABLE_PRODUCTS_OPTIONS_STOCK ."
        where product_id = '". (int)$product_id ."'
        and combination = '". database::input($option_stock_combination) ."';"
      );
      if (database::num_rows($products_options_stock_query) > 0) {
        if (empty($option_stock_combination)) {
          trigger_error('Invalid option stock combination ('. $option_stock_combination .') for product id '. $product_id, E_USER_ERROR);
        } else {
          database::query(
            "update ". DB_TABLE_PRODUCTS_OPTIONS_STOCK ."
            set quantity = quantity + ". (float)$quantity ."
            where product_id = '". (int)$product_id ."'
            and combination =  '". database::input($option_stock_combination) ."'
            limit 1;"
          );
        }
      } else {
        $option_id = 0;
      }
    }

    database::query(
      "update ". DB_TABLE_PRODUCTS ."
      set quantity = quantity + ". (int)$quantity ."
      where id = '". (int)$product_id ."'
      limit 1;"
    );
  }

  function catalog_purchase_count_adjust($product_id, $quantity) {

    $products_options_query = database::query(
      "update ". DB_TABLE_PRODUCTS ."
      set purchases = purchases + ". (int)$quantity ."
      where id = '". (int)$product_id ."'
      limit 1;"
    );
  }

?>
 
Discussions similaires
Haut