Fatal error allowed memory size aléatoire

Fatal error allowed memory size aléatoire - PHP - Programmation

Marsh Posté le 05-02-2014 à 15:43:01    

Bonjour,
 
J'ai un truc bizarre sur l'appli Canteen Calandreta (cf ma signature) : sur ma station de dév (un simple PC), RAS, sur l'actuel serveur de prod (un mutualisé) RAS mais sur mon NAS Synology, y'a un script qui génère de temps en temps un Fatal error allowed memory size aléatoire. Pourtant, c'est sur une simple opération de concaténation de chaîne de caractères ($MaVar .= "Une chaîne de caractères sur 2-3 lignes";). Et si je fais un "F5" pour rafraichir la page, au bout d'une ou 2 fois, le message disparaît et le script s'exécute normalement. Et une fois que le script s'est exécuté correctement, souvent les queqlues exécutions suivantes se passent bien...
 
Pourtant, le memory limit est à 128M. Or, le message d'erreur semble indiquer que le script essaye d'allouer 1 Go de mémoire :??: Vue la taille de la chaîne de caractères à concaténer, je vois pas où il va chercher un tel besoin de mémoire :/ Et comme indiqué, c'est pas systématique.
 
Une idée d'où ça pourrait venir ?
 
Merci :jap:


Message édité par rufo le 05-02-2014 à 15:43:21

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 05-02-2014 à 15:43:01   

Reply

Marsh Posté le 05-02-2014 à 16:31:57    

Elle vient d'où la chaîne? C'est toi qui l'a écrite directement dans le fichier?
Elle est concaténée avec quelle chaîne? Elle vient d'où?

Reply

Marsh Posté le 05-02-2014 à 16:35:25    

PHP ne doit pas voir la fin de la chaine.
 
Il me semble que ça peut arriver dans certains cas spéciaux quand on a un guillemet ou une apostrophe à l'intérieur d'une chaine, parce qu'il attend l'autre guillemet ou l'autre apostrophe, ou à cause d'un dollar à l'intérieur, ou un &. Je ne me souviens plus très bien, mais j'avais eu le cas et ça venait du contenu de la chaine.

Reply

Marsh Posté le 06-02-2014 à 10:25:37    

Mon code à cette forme là :

Code :
  1. function Toto($StartDate, $EndDate)
  2. {
  3.    ...
  4.    $Where = "WHERE";
  5.    switch($Mode)
  6.    {
  7.         ...
  8.         case DATES_BETWEEN_PLANNING:
  9.         // Un commentaire sur une ligne
  10.         $Where .= " ((\"$StartDate\" BETWEEN DATE_FORMAT(nr.ForDate,'%Y-%m-%d') AND
  11.                        DATE_FORMAT(nr.ForDate,'%Y-%m-%d')) OR (\"$EndDate\" BETWEEN DATE_FORMAT(nr.ForDate,'%Y-%m-%d')
  12.                        AND DATE_FORMAT(nr.ForDate,'%Y-%m-%d')))";
  13.         break;
  14.  
  15.         default:
  16.             ....
  17.         break;
  18.    }
  19.  
  20.    ....
  21. }


 
La ligne qui lève le fatal error sur le NAS, c'est celle concernant le $Where .= dans le switch. Je précise que le contenu des variables $StartDate et $EndDate sont corrects avec une valeur "yyyy-mm-dd". Ca pourrait venir du fait que ma chaîne de caractère est sur plusieurs lignes :??: Pourtant, en 10 ans de dév php, j'ai jamais eu de pb avec ça... :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 06-02-2014 à 10:55:59    

Au pire ça ne coûte rien d'écrire ta requête sur une seule ligne, tu peux aussi essayer le formatage de chaîne mais avec les '%Y-%m-%d' je ne suis pas sûr que ça ne va pas mettre la merde.
 
Debug tes variables pour voir si elles sont correctes quand ça bug parce que là tes autres chaînes sont écrites "à la main" donc il n'y a pas de raison que ça bug une fois et pas l'autre ou alors l'erreur est antécédente, ta mémoire est presque à saturation sur une connerie d'avant et tu arrives au dépassement sur cette ligne.

Reply

Marsh Posté le 06-02-2014 à 11:10:51    

Oui, c'est étrange.
 
Personnellement, je privilégierais l'écriture de la ligne comme ceci :

        $Where .= " ((\"".$StartDate."\" BETWEEN DATE_FORMAT(nr.ForDate,'%Y-%m-%d') AND"
               ." DATE_FORMAT(nr.ForDate,'%Y-%m-%d')) OR (\"".$EndDate."\" BETWEEN DATE_FORMAT(nr.ForDate,'%Y-%m-%d')"
               ." AND DATE_FORMAT(nr.ForDate,'%Y-%m-%d')))";

Mais, je ne suis pas sûr que ça change grand chose.
 
Je pense que le problème, vient d'ailleurs.
 
Par exemple, un cas courant d'erreur dans un switch, est d'oublier un break; avant le case qui pose un problème.
 
Ou peut-être qu'il y aurait un mauvais contenu dans $StartDate, $EndDate, ou même dans nr.ForDate.
 
D'ailleurs, c'est bizarre de faire un between entre deux dates identiques (entre nr.ForDate et nr.ForDate).

Reply

Marsh Posté le 06-02-2014 à 11:35:17    

Non, pas de break; oublié dans le switch. Je prend note de ta proposition de réécriture.
Pour le contenu des 2 variables, j'ai pas de toute puisque je disais qu'en faisant un F5 1 fois ou plusieurs fois, ça finissait par passer.
 
Pour le coup du between, effectivement, faudra que je réécrive ça. Ca venait d'un code où dans la table, j'avais 2 champs, DateDebut et DateFin et donc, quand je faisais une recherche en donnant un intervalle de dates ($StartDate et $EndDate, j'avais 4 façon de rechercher :
DateDebut >= $StartDate ET DateFin <= $EndDate
$StartDate >= DateDebut ET $EndDate <= DateFin
($StartDate entre DateDebut et DateFin) OU ($EndDate entre DateDebut et DateFin)
(DateDebut entre $StartDate et $EndDate) OU (DateFin entre $StartDate et $EndDate)
 
Mais là, vu que j'ai qu'un seul champ date, j'ai plus que 2 possibilités :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed