Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1480 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Fatal error allowed memory size aléatoire

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fatal error allowed memory size aléatoire

n°2218695
rufo
Pas me confondre avec Lycos!
Posté le 05-02-2014 à 15:43:01  profilanswer
 

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 Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
mood
Publicité
Posté le 05-02-2014 à 15:43:01  profilanswer
 

n°2218708
MaybeEijOr​Not
but someone at least
Posté le 05-02-2014 à 16:31:57  profilanswer
 

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ù?

n°2218709
olivthill
Posté le 05-02-2014 à 16:35:25  profilanswer
 

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.

n°2218786
rufo
Pas me confondre avec Lycos!
Posté le 06-02-2014 à 10:25:37  profilanswer
 

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 Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2218793
MaybeEijOr​Not
but someone at least
Posté le 06-02-2014 à 10:55:59  profilanswer
 

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.

n°2218794
olivthill
Posté le 06-02-2014 à 11:10:51  profilanswer
 

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).

n°2218798
rufo
Pas me confondre avec Lycos!
Posté le 06-02-2014 à 11:35:17  profilanswer
 

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 Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Fatal error allowed memory size aléatoire

 

Sujets relatifs
Problème enregistrement canvas avec photo en fond (security error)unexpectable error
personalisation Tumblr affichage aléatoireCréer un signal sonore aléatoire ?
[Resolu] Création d'un générateur de code aléatoire sans doublonnommer le contenu d'un nombre de feuilles aléatoire [XL2013]
FatalErrorException: Error: Class 'Doctrine\Bundle\FixturesBundle\DocPHP Fatal error: Class 'DoctrineBundleFixturesBundle not found
Comment générer un nombre aléatoire en C++ ? 
Plus de sujets relatifs à : Fatal error allowed memory size aléatoire


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR