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;
    
    }