Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481

    Fatal error: Allowed memory size...impossibile!

    Ho creato una pagina che data un'immagine jpeg uplodata, ne genera due ridimensionate e le salva in un db, solo che ad es. con immagini da 112 kb ricevo già l'errore, il fatto è che lo stesso script in una macchina windows va, in linux no, il memory_limit del php è in entrambi i casi 8M, qual è il problema?!

    Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 2048 bytes) in genera_immagine.php on line 87

  2. #2
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    L'immagine da 123K è da 1000x430, probabilmente richiedono molta memoria in quanto sono molto grandi da elaborare, ma:
    1. xke in windows funziona?
    2. xke l'errore dice "tried to allocate 2048 bytes" quando disponibili ce ne sono 8388608?
    3. possibile che non posso elaborare neanche un'immagine da 123K??

  3. #3
    Originariamente inviato da james
    L'immagine da 123K è da 1000x430, probabilmente richiedono molta memoria in quanto sono molto grandi da elaborare, ma:
    1. xke in windows funziona?
    2. xke l'errore dice "tried to allocate 2048 bytes" quando disponibili ce ne sono 8388608?
    3. possibile che non posso elaborare neanche un'immagine da 123K??
    ehm

    1)windows non supporta la limitazione della memoria
    2) no ti dice che ha provato ad allocare 2 kappa oltre gli 8mb
    3) beh...se in 123kappa ci sta un'immagine di 1000x430 a 16 mln di colori servono, per caricarla in memoria serve + di un mb e 2...quindi ti rimangono disponibili circa 6,8mb...di questi 6,8 mb tieni conto che almeno un mb ti serve per lo script...quindi ti rimane circa 5.8mb...di questi 5.8 mb ci fai i tuoi lavori...poi c'è da vedere come hai scritto il codice

    il picci...quando carica in memoria l'immagine...la trasforma in una mappa di bit (nel caso delle immagini a 24bit...una mappa di 24 bit per punto...ovvero di 3 byte per punto)...non puoi visualizzare un'immagine compressa ^^
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  4. #4
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da daniele_dll
    ehm

    1)windows non supporta la limitazione della memoria
    2) no ti dice che ha provato ad allocare 2 kappa oltre gli 8mb
    3) beh...se in 123kappa ci sta un'immagine di 1000x430 a 16 mln di colori servono, per caricarla in memoria serve + di un mb e 2...quindi ti rimangono disponibili circa 6,8mb...di questi 6,8 mb tieni conto che almeno un mb ti serve per lo script...quindi ti rimane circa 5.8mb...di questi 5.8 mb ci fai i tuoi lavori...poi c'è da vedere come hai scritto il codice

    il picci...quando carica in memoria l'immagine...la trasforma in una mappa di bit (nel caso delle immagini a 24bit...una mappa di 24 bit per punto...ovvero di 3 byte per punto)...non puoi visualizzare un'immagine compressa ^^
    Molto esauriente nelle spiegazioni, un consiglio sul come risolvere il problema? Posso postare il codice ma non è che ci sia molto da vedere.

  5. #5
    Originariamente inviato da james
    Molto esauriente nelle spiegazioni, un consiglio sul come risolvere il problema? Posso postare il codice ma non è che ci sia molto da vedere.
    puoi solo aumentare la memoria...oppure svuotare le variabili e chiudere le resource (con le apposite funzioni) ad ogni operazione...+ di questo non ti posso dire
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  6. #6
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da daniele_dll
    puoi solo aumentare la memoria...oppure svuotare le variabili e chiudere le resource (con le apposite funzioni) ad ogni operazione...+ di questo non ti posso dire
    ho sentito che aumentare la memoria non è una grande idea, se possibile preferirei il secondo metodo, quali sono alcune di queste funzioni? non le ho mai usate, non so neanche di cosa parli, se me le menzioni poi mi leggo il manuale...

  7. #7
    Originariamente inviato da james
    ho sentito che aumentare la memoria non è una grande idea, se possibile preferirei il secondo metodo, quali sono alcune di queste funzioni? non le ho mai usate, non so neanche di cosa parli, se me le menzioni poi mi leggo il manuale...
    posta il codice
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  8. #8
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da daniele_dll
    posta il codice
    Allora uso due funzioni e una classe per fare questo lavoro:

    Codice PHP:
    <?
    $immagine_obj 
    = new ManipulateImages();
    $immagine_obj->after_error_page "gestione.php$link";
    $immagine_obj->final_width 800;
    $immagine_obj->final_height 600;
    $immagine $immagine_obj->ResizeAndConvertToBinary($_FILES['immagine']);
    $immagine_obj->final_width 150;
    $immagine_obj->final_height 100;
    $immagine_thumb $immagine_obj->ResizeAndConvertToBinary($_FILES['immagine']);

    $_POST['nome'] = $_POST['nome'];
    $_POST['descrizione'] = $_POST['descrizione'];
    $str_insert "
    INSERT INTO nuove
    (nuova_id_categoria_nuove, nuova_nome, nuova_descrizione, nuova_immagine, nuova_immagine_width, nuova_immagine_height,
    nuova_immagine_thumb, nuova_immagine_thumb_width, nuova_immagine_thumb_height, nuova_immagine_tipo)
    VALUES
    ('"
    .$_POST['id_categoria']."', '".$_POST['nome']."', '".$_POST['descrizione']."', '".$immagine['pf_image']."',
    '"
    .$immagine['width']."', '".$immagine['height']."', '".$immagine_thumb['pf_image']."', '".$immagine_thumb['width']."',
    '"
    .$immagine_thumb['height']."', '".$_FILES['immagine']['type']."');";
    $result ExecuteMysqlQuery($str_insert);

    ShowMessage("Macchina caricata con successo""gestione.php$link"$title='Aggiungi');
    ?>

    <?
    class ManipulateImages {

        
    // INIZIO PARAMETRI DI CONFIGURAZIONE
        
        // variabili della classe
        
    var $final_width 0;                    // dimensione orizzontale finale delle immagini in pixel
        
    var $final_height 0;                    // dimensione verticale finale delle immagini in pixel
        
    var $final_path_and_name '';            // path e nome del file su cui deve essere salvata l'immagine
        
    var $max_size_image '1048576';        // dimensioni massime in byte dell'immagine originale
        
    var $image_quality 75;                // qualità, da 0 a 100
        
        
        // variabili del sito
        
    var $after_error_page 'index.php';            // indirizzo assoluto della pagina a cui rimandare l'utente in caso di errore

        // messaggi all'utente
        
    var $msg_error_too_big_or_not_jpg "Le immagini devono essere in formato JPEG e di dimensioni inferiori ad 1 Mb.";
        
        
    // FINE PARAMETRI DI CONFIGURAZIONE







        //CODICE
        
        
        // il costruttore della classe, non fa nulla!
        
    function ManipulateImages() {
            
    // do nothing
        
    }

        
    // ResizeImage si occupa di ridimensionare l'immagine alle dimensioni specificate come parametri della classe, nello
        // specifico:
        // 1. controllo che l'immagine sia JPEG e di dimensioni inferiori al valore settato, se accade riporto l'errore
        // 2. ricava le dimensioni dell'immagine originale
        // 3. se l'immagine è più grande delle dimensioni di destinazione, calcolo le nuove dimensioni proporzionalmente        
        // 4. crea una nuova immagine
        // 5. crea una nuova immagine dalla jpeg originaria
        // 6. incolla restringendo la jpeg originaria sulla nuova immagine
        // 7. restituisce l'immagine con qualita di compressione pari a XX e le dimensioni e type
        
    function ResizeImage($pf_image) {
            
    // 1. controllo che l'immagine sia JPEG e di dimensioni inferiori al valore settato, se accade riporto l'errore
            
    $tipo = (substr($pf_image['type'],-4));
            if (((
    substr($pf_image['type'],-4))!='jpeg') || ($pf_image['size']>$this->max_size_image)) {
                
    ShowMessage($this->msg_error_too_big_or_not_jpg$this->after_error_page);
            }
            
    // 2. ricava le dimensioni dell'immagine originale
            
    $dimension GetImageSize($pf_image['tmp_name']);
            
    //echo "

    </p>tipo:".$pf_image['type'].' dimensioni:'.$pf_image['size'].' larghezza:'.$dimension[0].' altezza:'.$dimension[1];
            //echo "
    ".
    $dimension[0]." ".$dimension[1];
            
            // 3. se l'immagine è più grande delle dimensioni di destinazione, calcolo le nuove dimensioni proporzionalmente        
            if ((
    $dimension[0]>$this->final_width) || ($dimension[1]>$this->final_height)) {
                if ((
    $dimension[0]/$this->final_width)>($dimension[1]/$this->final_height)) {
                    
    $new_width = $this->final_width;
                    
    $new_height = round($dimension[1]/($dimension[0]/$this->final_width));
                } else {
                    
    $new_height = $this->final_height;
                    
    $new_width = round($dimension[0]/($dimension[1]/$this->final_height));
                }
            } else {
                
    $new_width = $dimension[0];
                
    $new_height = $dimension[1];
            }
            
            //echo "
    Nuova larghezza".$new_width." nuova altezza:".$new_height;
            // 4. crea una nuova immagine
            
    $new_img_pf = ImageCreateTrueColor($new_width,$new_height); 
            
            // 5. crea una nuova immagine dalla jpeg originaria
            
    $old_image_pf = ImageCreatefromJPEG($pf_image['tmp_name']);
            
            // 6. incolla restringendo la jpeg originaria sulla nuova immagine
            imagecopyresized (
    $new_img_pf$old_image_pf,0,0,0,0,$new_width,$new_height,$dimension[0],$dimension[1]);
            
            // 7. restituisce l'immagine con qualita di compressione pari a XX
            
    $path = $this->final_path_and_name=='' ? $pf_image['tmp_name'] : $this->final_path_and_name;
            ImageJPEG(
    $new_img_pf,$path$this->image_quality);
            
    $results['pf_image'] = $path;
            
    $image_dimensions = getimagesize($path);
            
    $results['width'] = $image_dimensions[0];
            
    $results['height'] = $image_dimensions[1];
            
    $results['type'] = $image_dimensions[2];
            
    $results['width_height'] = $image_dimensions[3];
            return 
    $results;
        }
        
        function ResizeAndConvertToBinary(
    $pf_image) {
            
    $pf_image = $this->ResizeImage($pf_image);
            
    $pf_image['pf_image'] = ConvertToBinary($pf_image['pf_image']);
            return 
    $pf_image;
        }
    }
    ?>

    <?
    function ConvertToBinary(
    $file_to_convert) {
        
    $pf_file = fopen($file_to_convert, "rb");
        
    $pf_file = fread($pf_file, filesize($file_to_convert));
        
    $pf_file = addslashes($pf_file);
        return 
    $pf_file;
    }

    ?>

  9. #9
    metteresti i tag code cosi è + leggibile
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  10. #10
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da daniele_dll
    metteresti i tag code cosi è + leggibile
    scusa, l'ho modificato un attimo dopo averlo inviato, così va bene?

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.