Visualizzazione dei risultati da 1 a 7 su 7

Discussione: PHP e la memoria

  1. #1

    PHP e la memoria

    Ciao ragazzi, mi trovo ad affrontare un problema riguardante la memoria occupata da uno script in cui ho bisogno dell'aiuto di chi ne capisce più di me... In pratica, ho realizzato una gallery e devo gestire l'upload di immagini da parte di utenti, con ridimensionamento delle stesse. Viste le dimensioni delle immagini scattate dalle digitali di oggi, ho ampliato il limite di upload per i file attraverso il file .htaccess (non ho accesso alle configurazioni del php sul server), attraverso queste righe:

    codice:
    php_value upload_max_filesize 5M
    php_value post_max_size 7M
    php_value max_execution_time 800
    Giustamente però, incrementando il peso massimo di upload penso di dover aumentare anche la memoria del PHP, o almeno questo è quello che evinco dal fatto che mi da un "Allowed memory size of 16777216 bytes exhausted".. La mia domanda è: esiste un modo per effettuare un ridimensionamento della memoria disponibile allo script che sia proporzionale alla dimensione delle immagini e, se sì, quale?

    Dalle mie modeste conoscenze in merito all'argomento, credo che il grosso della memoria venga impegnato per ospitare in memoria gli oggetti immagine sorgente e immagine di destinazione. Vi posto le funzioni che effettuano il ridimensionamento (che ho verificato essere quelle dove il sistema va in crash), anche suggerimenti sull'ottimizzazione delle stesse sono ben graditi... Vi ringrazio.

    Codice PHP:
        # crea la preview di una immagine
        
    function img_createPreview($photo_vars$photo_max_size) {
        
            global    
    $utenteid;
            
            
    # crea un'istanza immagine della foto a seconda del formato dell'immagine
            
    switch($photo_vars['Type']) {
            
                case 
    1: {
                
                    
    # crea l'istanza per un'immagine GIF
                    
    if(!$photo_source imagecreatefromgif($photo_vars['Path']))
                        return 
    false;
                        
                    break;
                
                }
                
                case 
    2: {
                
                    
    # crea l'istanza per un'immagine JPEG
                    
    if(!$photo_source imagecreatefromjpeg($photo_vars['Path']))
                        return 
    false;
                        
                    break;
                    
                }
                
                case 
    3: {
                
                    
    # crea l'istanza per un'immagine PNG
                    
    if(!$photo_source imagecreatefrompng($photo_vars['Path']))
                        return 
    false;
                        
                    break;
                    
                }
                
            }
            
            
    # memorizza altezza e larghezza immagine in variabili temporanee
            
    $photo_width    $photo_vars['Width'];
            
    $photo_height    $photo_vars['Height'];
            
            
    # verifica se l'altezza è maggiore della larghezza
            
    if($photo_height  $photo_width) {
            
                
    # verifica se l'altezza supera la dimensione massima consentita
                
    if($photo_height $photo_max_size) {
                
                    
    # ridimensiona l'altezza
                    
    $photo_height    $photo_max_size;
                    
                    
    # ridimensiona la larghezza
                    
    $photo_width    number_format( ($photo_vars['Width'] * $photo_height) / $photo_vars['Height'] , 0);
                
                }
                
            } else {
            
                
    # verifica se la larghezza supera la dimensione massima consentita
                
    if($photo_width $photo_max_size) {
                
                    
    # ridimensiona la larghezza
                    
    $photo_width    $photo_max_size;
                    
                    
    # ridimensiona la larghezza
                    
    $photo_height    number_format( ($photo_vars['Height'] * $photo_width) / $photo_vars['Width'] , 0);
                
                }
            
            }
            
            
    # crea un'immagine truecolor della nuova dimensione
            
    if(!$photo_preview imagecreatetruecolor($photo_width$photo_height))
                return 
    false;
            
            
    # ridimensiona e copia il contenuto della sorgente nella nuova immagine truecolor
            
    if(!imagecopyresampled($photo_preview$photo_source0000$photo_width$photo_height$photo_vars['Width'], $photo_vars['Height']))
                return 
    false;

        
    # watermark :: inizio

            # verifica se devi stampare il watermark sulla foto
            
    if($photo_vars['Protect']) {
            
                
    # memorizza un colore per il testo watermark
                
    $watermark_color    imagecolorallocatealpha($photo_source2552552550);
        
                
    # logo creative commons
                
    $watermark_font    "lib/creativecommons.ttf";
                
    imagettftext($photo_preview24010$photo_height 10$watermark_color$watermark_font"c");
                
                
    # nome utente
                
    $watermark_font "lib/arialbd.ttf";
                
                
    # calcola la grandezza del nome
                
    $watermark_width = (strlen($utenteid) * 14) + 8;
                
                
    imagettftext($photo_preview160$photo_width $watermark_width$photo_height 10$watermark_color$watermark_fontstrtolower($utenteid));
                
            }
            
            
    # converti l'immagine preview e salvala
            
    switch($photo_vars['Type']) {
            
                case 
    1: {
                
                    
    # salva l'immagine GIF
                    
    if(!imagegif($photo_preview$photo_vars['Folder']."pre_".$photo_vars['File']))
                        return 
    false;
                        
                    break;
                
                }
                
                case 
    2: {
                
                    
    # salva l'immagine JPEG / JPG
                    
    if(!imagejpeg($photo_preview$photo_vars['Folder']."pre_".$photo_vars['File'], 90))
                        return 
    false;
                        
                    break;
                    
                }
                
                case 
    3: {
                
                    
    # salva l'immagine GIF
                    
    if(!imagepng($photo_preview$photo_vars['Folder']."pre_".$photo_vars['File']))
                        return 
    false;
                        
                    break;
                    
                }
                
            }
            
            
    # libera la memoria allocata per le immagini
            
    @imagedestroy($photo_preview);
            @
    imagedestroy($photo_source);
            
            return 
    true;
        
        } 
    Codice PHP:
        # crea la thumbnail dell'immagine
        
    function img_createThumb($photo_vars$photo_size) {

            
    # crea un'istanza immagine della foto a seconda del formato dell'immagine
            
    switch($photo_vars['Type']) {
            
                case 
    1: {
                
                    
    # crea l'istanza per un'immagine GIF
                    
    if(!$photo_source imagecreatefromgif($photo_vars['Path']))
                        return 
    false;
                        
                    break;
                
                }
                
                case 
    2: {
                
                    
    # crea l'istanza per un'immagine JPEG
                    
    if(!$photo_source imagecreatefromjpeg($photo_vars['Path']))
                        return 
    false;
                        
                    break;
                    
                }
                
                case 
    3: {
                
                    
    # crea l'istanza per un'immagine PNG
                    
    if(!$photo_source imagecreatefrompng($photo_vars['Path']))
                        return 
    false;
                        
                    break;
                    
                }
                
            }
            
            
    # memorizza altezza e larghezza immagine in variabili temporanee
            
    $photo_width    $photo_size;
            
    $photo_height    $photo_size;
            
            
    # crea un'immagine truecolor della nuova dimensione
            
    if(!$photo_thumb imagecreatetruecolor($photo_width$photo_height))
                return 
    false;
            
            
    # ridimensiona e copia il contenuto della sorgente nella nuova immagine truecolor
            
    if($photo_vars['Width'] > $photo_vars['Height']) {

                if(!
    imagecopyresampled($photo_thumb$photo_source00number_format(($photo_vars['Width'] / 2) - ($photo_vars['Height'] / 2), 0), 0$photo_width$photo_height$photo_vars['Height'], $photo_vars['Height']))
                    return 
    false;

            } elseif(
    $photo_vars['Width'] < $photo_vars['Height']) {

                if(!
    imagecopyresampled($photo_thumb$photo_source000number_format(($photo_vars['Height'] / 2) - ($photo_vars['Width'] / 2)), $photo_width$photo_height$photo_vars['Width'], $photo_vars['Width']))
                    return 
    false;
            
            } elseif(
    $photo_vars['Width'] == $photo_vars['Height']) {

                if(!
    imagecopyresampled($photo_thumb$photo_source0000$photo_width$photo_height$photo_vars['Width'], $photo_vars['Height']))
                    return 
    false;
                    
            }

            
    # converti l'immagine preview e salvala
            
    switch($photo_vars['Type']) {
            
                case 
    1: {
                
                    
    # salva l'immagine GIF
                    
    if(!imagegif($photo_thumb$photo_vars['Folder']."thumb_".$photo_vars['File']))
                        return 
    false;
                        
                    break;
                
                }
                
                case 
    2: {
                
                    
    # salva l'immagine JPEG / JPG
                    
    if(!imagejpeg($photo_thumb$photo_vars['Folder']."thumb_".$photo_vars['File'], 90))
                        return 
    false;
                        
                    break;
                    
                }
                
                case 
    3: {
                
                    
    # salva l'immagine GIF
                    
    if(!imagepng($photo_thumb$photo_vars['Folder']."thumb_".$photo_vars['File']))
                        return 
    false;
                        
                    break;
                    
                }
                
            }

            
    # libera la memoria allocata per le immagini
            
    @imagedestroy($photo_thumb);
            @
    imagedestroy($photo_source);

            return 
    true;
        
        } 

  2. #2
    La mia domanda è: esiste un modo per effettuare un ridimensionamento della memoria disponibile allo script che sia proporzionale alla dimensione delle immagini e, se sì, quale?
    Se puoi assegnare piu' memoria allo script, assegnala. PHP occupera' solo la memoria che gli necessita realmente e non tutta quella specificata dalla configurazione.

  3. #3
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    Originariamente inviato da filippo.toso
    Se puoi assegnare piu' memoria allo script, assegnala. PHP occupera' solo la memoria che gli necessita realmente e non tutta quella specificata dalla configurazione.
    appunto... se puoi!

    controlla che sul server la variabile safe_mode sia impostata ad Off. Se così fosse allora hai probabilità di riuscire ad aumentare la memoria, viceversa non c'è possibilità



    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  4. #4
    Grazie per la risposta, ho aumentato la memoria per l'esecuzione dello script e ora sono in fase di testing ma pare proprio funzionare!

  5. #5
    Originariamente inviato da zoostation
    Grazie per la risposta, ho aumentato la memoria per l'esecuzione dello script e ora sono in fase di testing ma pare proprio funzionare!
    posso chiederti come hai aumentato la memoria d'utilizzo?

  6. #6

  7. #7
    Originariamente inviato da filippo.toso
    Ti suggerisco di iniziare leggendo il manuale ufficiale:

    http://www.php.net/manual/it/ini.cor...i.memory-limit
    http://www.php.net/ini_set
    pensavo che c'erano altri modi... :d
    cmq grazie

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.