Visualizzazione dei risultati da 1 a 8 su 8

Discussione: PHP e consumo memoria

  1. #1

    PHP e consumo memoria

    Ho uno script che per orgni record di un DB mi crea su disco un file excel.

    utilizzo la libreria PHPExcel (phpexcel.codeplex.com)

    il codice per la creazione del file è in una funzione chiamata crea_excel($id)

    quindi il mio script fa qualcosa del genere

    Codice PHP:
    foreach($item ad $id)
    {
        
    crea_excel($id);

    ora mi capita che se ci sono piu' di tre file da creare mi supera il limite di memoria e lo script si blocca. La creazione del singolo file richiede l'allocazione di parecchia memoria e questo è normale.

    Ma mi verrebbe da pensare che ad ogni ciclo la memoria venga deallocata. Invece il consumo cresce od ogni iterazione fino a superare il limite.

    Sto facendo qualche errore di concetto o è più probabile che debba cercare qualche svista nel codice? (Che ne so, magari senza accorgermene sto popolando qualche array...)

    un grazie a chi mi aiuta

  2. #2
    Ciao,
    potrebbe essere che la funzione crea_excel() restituisce il riferimento al file, quindi dopo qualche file la memoria si esaurisce. Dovresti vedere se esiste qualche funzione che permette di eliminare questo riferimento.
    CODENCODE \ Branding \ Design \ Marketing
    www.codencode.it

  3. #3
    la funzione crea_excel da me creata restituisce true se tutto è andato a buon fine. Niente di più

    al suo interno instanzio vari oggetti della libreria PHPExcel e alla fine (sempre dentro la mia funzione) chiamo un metodo denominato 'save' che salva il file in memoria. La funzione save non restituisce nulla.

    per quel che puo' servire ecco alcune parti della funzione crea_excel

    ($posizione è solo una stringa che andrò a scrivere in una cella del file)

    Codice PHP:
    function crea_excel($id$posizione=""$filename=""$save=false)
    {
        global 
    $db;

        
    // instanzio l'oggetto per la creazione dell'excel
        
    $objPHPExcel = new PHPExcel();
        
        
    // bla bla bla......
        // chiamate varie per creare l'excel in base all'id fornito
        // bla bla bla......

        
    if($save)
        {
            
    $objWriter PHPExcel_IOFactory::createWriter($objPHPExcel'Excel5');
            
    $objWriter->save($filename);
            return 
    true;
        }



  4. #4

  5. #5
    Ciao, io ho avuto un problema simile al tuo con delle immagini, in pratica in un ciclo utilizzando la funzione imagecreatetruecolor(), la memoria si esauriva, quindi dopo aver terminato la manipolazione dell'immagine ho dovuto utilizzare la funzione imagedestroy() che accetta la risorsa ritornata dalla funzione imagecreatetruecolor().
    Forse potrebbe essere un problema simile anche nel tuo caso.
    CODENCODE \ Branding \ Design \ Marketing
    www.codencode.it

  6. #6
    ciao codencode. Intanto grazie per il suggerimento

    purtroppo l'oggetto PHPExcel non ha una funzione per distruggerlo.

    Ad ogni per il mio problema specifico posso anche trovare un workaround.

    Tuttavia vorrei riuscire a capire perché un oggetto istanziato all'interno di una funzione debba continuare ad utilizzare risorse di memoria anche una volta che lo script è uscito dalla funzione


  7. #7
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    hai provato a fare un unset($obj) prima di fere il return ?
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  8. #8
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,287
    Istanzia l'oggeto fuori dal ciclo.

    Qualcosa come
    Codice PHP:
    $objPHPExcel = new PHPExcel();

    //richiami la funzione passando l'oggetto.

    function crea_excel($objPHPExcel$id$posizione=""$filename=""$save=false)
    {
        
    // bla bla bla......
        // chiamate varie per creare l'excel in base all'id fornito
        // bla bla bla......

        
    if($save)
        {
            
    $objWriter PHPExcel_IOFactory::createWriter($objPHPExcel'Excel5');
            
    $objWriter->save($filename);
            return 
    true;
        }



Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.