IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Message d'erreur Allowed memory size


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    aux études mais 40 ans
    Inscrit en
    Juin 2004
    Messages
    2 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : aux études mais 40 ans

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 017
    Points : 308
    Points
    308
    Par défaut Message d'erreur Allowed memory size
    Bonjour,

    J'ai un petit code qui va chercher des données dans une page xlsx et qui le met en forme.
    C'est visible ici : http://www.espaceimagi.be/agendamaster/

    Comme vous voyez il y a un message d'erreur dans le bas mais je ne comprends pas pourquoi d'autant plus que tout est affiché correctement.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="initial-scale = 1.0, maximum-scale = 1.0, user-scalable = no, width = device-width">
    <link rel="stylesheet" href="style.css" media="screen">
    </head>
    <body>
     <div id="agendalong">
     
    <!--   DEBUT DU PHP ***********-->
    <?php
    $artout="jdw";
    /** Charger la bibliothèque **/ 
    set_include_path(get_include_path() . PATH_SEPARATOR . './Classes/');
    include 'PHPExcel/IOFactory.php';
    /** définir le fichier à examiner*/ 
    $inputFileName = './dates.xlsx';
    /** On "charge le fichier excel*/
    $objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
    /** On dit que c'est la feuille 0 du fichier excell qu'on va utiliser*/
    $worksheet=$objPHPExcel->getSheet(0);
    /** je met à zero la variable qui va compter les lignes*/
    $i=1;
    /** On boucle pour passer les lignes en revue*/
    foreach ($worksheet->getRowIterator() as $row) {
    	$i = $row->getrowindex();	
    	/** Ici je met dans les différentes variables le contenu de la cellule concernée pour la ligne en cours*/
    												$affiche    =$worksheet->getCellByColumnAndRow('0',$i)->getCalculatedValue();
    												$lieu       =$worksheet->getCellByColumnAndRow('1',$i)->getCalculatedValue();
    												$datu       =$worksheet->getCellByColumnAndRow('2',$i)->getCalculatedValue();
    												$heure      =$worksheet->getCellByColumnAndRow('3',$i)->getCalculatedValue();
    												$site       =$worksheet->getCellByColumnAndRow('4',$i)->getCalculatedValue();
    												$mail       =$worksheet->getCellByColumnAndRow('5',$i)->getCalculatedValue();
    												$telephone  =$worksheet->getCellByColumnAndRow('6',$i)->getCalculatedValue();
    												$reserve    =$worksheet->getCellByColumnAndRow('7',$i)->getCalculatedValue();
    												$coment     =$worksheet->getCellByColumnAndRow('8',$i)->getCalculatedValue();
    												$artiste    =$worksheet->getCellByColumnAndRow('9',$i)->getCalculatedValue();
    												$spectacle  =$worksheet->getCellByColumnAndRow('10',$i)->getCalculatedValue();
    												$dati		= PHPExcel_Shared_Date::ExcelToPHP($datu);
    												$dati       =date('d-m-Y',$dati);
    												$dato       =date('d-m-Y');
    if ($artiste=="all") 
    {
    $artiste=$artout;
    }
    if ((strtotime($dati)>=strtotime($dato) && $artout==$artiste) or (strtotime($dati)>=strtotime($dato) && $artout=="all")) /** on regarde si la date de la ligne Excell est dans le passé, si pas on affiche le contenu des variables */
    {
    echo /** On envoi du HTML pour exploiter le contenu des différentes variables et que ça s'affiche bien*/
    <<<HTML
    <table width="100%" border="1"><tr>
    									<td width="15%"><img src="$affiche" width="134" height="179" /></td>
    									<td width="85%">
    													<span style='font-family:Comic Sans MS; text-align:left; font-size:20px; line-height:25px;'>{$lieu}</span>
    													
    													<BR>
    													<table width="100%" border="0"><tr>
    													
    																					<td width="80%">
    																					<span style='font-family:Arial; text-align:left; font-size:12px; line-height:22px;'>{$spectacle}</span> 
    																					<BR>
    																					<span style='font-family:Arial; text-align:left; font-size:12px; line-height:22px;'>Le {$dati} à {$heure}</span> 
    																					<BR>
    																					
    																					<span style='font-family:Arial; text-align:left; font-size:14px; line-height:22px;'>Réservation : <a href="{$site}" target="_blank">Site internet - </a> <a href="mailto:{$mail}">Par e-mail </a> 
    																					</span>
    																					<BR>
    																					
    																					<span style='font-family:Arial; text-align:left; font-size:14px; line-height:22px;'>Numéro de téléphone : {$telephone}</span> 
    																					<BR>
    																					<BR>
    																					<span style='font-family:Arial; text-align:left; font-size:18px; line-height:22px;'>{$coment}</span>
    																					</td>
    
    																		<td width="20%">
    																		<a href="$reserve" target="_blank">
    																		<img src="./images/bouton.png" width="134" height="134" class=""></a>
    																		</td>
    													</tr> 
    													</td>
    													</table>
    							</tr>
    </table>
    </html>
    HTML;
    }
    }
    $closeFileName = './dates.xlsx';
    ?>  
    </div>
     
    </body>
    </html>
    Vous voyez ce qui se passe ?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Utiliser un fichier Excel comme base de données pour un site web est une mauvaise idée : la lecture du fichier excel est longue et demande beaucoup de ressources.

    Est-ce que c'est volontaire que tu aies une table HTML par ligne affichée ?
    Tu as en plus un </html> par ligne.

    Concernant l'erreur précise, il est possible que tu aies plus de lignes dans ton fichier excel que tu ne veuilles. Par exemple si tu as des mises en forme sur toutes les cellules PHPExcel va les parcourir même s'il n'y a rien dedans.

  3. #3
    Membre averti
    Homme Profil pro
    aux études mais 40 ans
    Inscrit en
    Juin 2004
    Messages
    2 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : aux études mais 40 ans

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 017
    Points : 308
    Points
    308
    Par défaut
    Hello et merci pour ta réponse.

    Le choix du fichier xlsx est un choix pratique par rapport à la manière dont on travaille ici au bureau.
    On a sur un PC ce fichier xlsx auquel on peut accéder chacun (pas de souci de conflit on est que 3 et on se parle .
    Dans ce fichier on encode nos différents évent's avec de plus en plus d'infos (celle qui sont visibles sur le net et d'autres qui ne le sont pas comme le N° de TVA du client par exemple).
    Ce fichiers est automatiquement synchronisé toutes les nuits à 3 h AM avec notre hébergement web.
    Ainsi ont est sur que dès qu'un client est encodé il figure sur le site dans l'agenda.
    Les avantages :
    - C'est full automatique et on n'a pas d'encodage fastidieux à faire ne plus.
    - On a accès à notre fichier xlsx depuis d'autres endroits même sur nos smartphones.
    - C'est simple pour n'importe quelle secrétaire, simple comme un tableau excell :-).
    - On est très habitué comme ça et niveau "humain" ça fonctionne super bien --> on a pas envie de changer (oui je sais dur à entendre pour un informaticien).


    Maintenant pour en venir au problème lui même.
    Est-ce que c'est volontaire que tu aies une table HTML par ligne affichée ?
    Tu as en plus un </html> par ligne
    Oui et non, ce que je veux c'est que chaque date soit bien séparée et délimitée comme dans un petit cadre (regarde ici tu comprendras).
    Du coup je n'ai trouvé que ça comme solution mais au final je préfèrerais des beaux carrés transparent comme dans l'agenda de WordPress (http://i.stack.imgur.com/F9AOP.png)
    mais une chose à la fois je ne suis pas une flèche

    Concernant l'erreur précise, il est possible que tu aies plus de lignes dans ton fichier excel que tu ne veuilles. Par exemple si tu as des mises en forme sur toutes les cellules PHPExcel va les parcourir même s'il n'y a rien dedans.
    OK mais comment je peux arranger ça ?
    Ne serait-il pas possible d'inclure dans mon code quelque chose qui détecte par exemple une cellule vide et qui arrête à ce moment la ?
    Je ne vois pas trop comment faire ça...
    Ou alors s'il y a une meilleure solution...

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Tant qu'à utiliser un fichier comme stockage de données, pourquoi ne pas plutôt utiliser un fichier CSV ? C'est également éditable par Excel, mais ça reste un simple fichier texte et donc beaucoup moins lourd à lire.

    Sinon, pour interrompre ta boucle, tu peux tester une donnée dont tu sais qu'elle ne sera jamais vide.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    foreach ($worksheet->getRowIterator() as $row) {
    	$i = $row->getrowindex();	
    	/** Ici je met dans les différentes variables le contenu de la cellule concernée pour la ligne en cours*/
    	$affiche    =$worksheet->getCellByColumnAndRow('0',$i)->getCalculatedValue();
    	$lieu       =$worksheet->getCellByColumnAndRow('1',$i)->getCalculatedValue();
    	$datu       =$worksheet->getCellByColumnAndRow('2',$i)->getCalculatedValue();
     
    	if (empty($datu)) {
    	    // la colonne n'est jamais vide : 
    	    break;
    	}

  5. #5
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    Salut,

    Déjà déjà tu peux changer ta manière de lire le Xls, la librairie que tu utilises est assez gourmande... Vu qu'il s'agit d'une simple lecture:

    - Tu peux soit lire directement le xml associé à ton classeur dans xl\worksheets\ pour cela tu devra d'abord décompresser le fichier (une petite connaissance du format xls pourra aider, mais il n y a rien de compliquer)

    - Tu peux aussi voir du côté de php_excel qui est une extension native PHP avec des meilleures performances (J'ai commencé un article dessus il y a quelques années ici sur dvp...)

  6. #6
    Membre averti
    Homme Profil pro
    aux études mais 40 ans
    Inscrit en
    Juin 2004
    Messages
    2 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : aux études mais 40 ans

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 017
    Points : 308
    Points
    308
    Par défaut
    JE vais regarder vos solution dès que j'ai 5 minutes histoire de me mettre à l'abri pour l'avenir.
    Pour le moment j'ai trouvé une solution, j'ai juste fait un copy/paste des données dans un nouveau classeur et depuis plus de soucis...

    Merci à tous pour votre aide, je vous dirai quoi quand j'aurai testé vos solutions...

    A peluches...

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pour le moment j'ai trouvé une solution, j'ai juste fait un copy/paste des données dans un nouveau classeur et depuis plus de soucis...
    cela confirmerait que le fichier d'origine contient plus de lignes que de données.
    Comme l'indique Celira il suffit de sortir de la boucle dés que le première cellule ne contient rien.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Images] Galerie photo (Fatal error: Allowed memory size)
    Par Dookie dans le forum Bibliothèques et frameworks
    Réponses: 15
    Dernier message: 25/05/2010, 12h13
  2. Réponses: 1
    Dernier message: 03/10/2009, 11h36
  3. Erreur "Allowed memory size of x bytes exhausted"
    Par lysandre dans le forum Langage
    Réponses: 3
    Dernier message: 01/11/2008, 00h38
  4. [Librairies] zip.lib.php Fatal error: Allowed memory size of 8388608 bytes exhausted
    Par manaboko dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 22/05/2006, 10h42
  5. Fatal error: Allowed memory size of...
    Par Webfab dans le forum Langage
    Réponses: 3
    Dernier message: 17/09/2005, 10h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo