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_source, 0, 0, 0, 0, $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_source, 255, 255, 255, 0);
# logo creative commons
$watermark_font = "lib/creativecommons.ttf";
imagettftext($photo_preview, 24, 0, 10, $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_preview, 16, 0, $photo_width - $watermark_width, $photo_height - 10, $watermark_color, $watermark_font, strtolower($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_source, 0, 0, number_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_source, 0, 0, 0, number_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_source, 0, 0, 0, 0, $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;
}