Я пытаюсь изменить размер всех изображений в одном каталоге. Мой код работает найти, пока я не попытаюсь изменить размер каталога с 70 картинками. Я уже использую imagedestroy и unset. Но я все еще терплю неудачу с «Неустранимая ошибка: допустимый объем памяти 67108864 байтов исчерпан (попытался выделить 17232 байта) в». (Моя память php установлена на 64M и не может быть изменена)
$file = scandir ( $dir );
foreach ( $file as $key => $filename ) {
$src = $dir . '/' . $filename;
$dst = $dir . '/' . $filename;
$width = 660; // max width
$height = 2000; // max height
$message = image_resize ( $src, $dst, $width, $height, $crop = 0 );
if ($message == 1)
echo "$filename resize success!</br>";
else
echo "$filename $message</br>";
}
function image_resize($src, $dst, $width, $height, $crop = 0) {
if (! list ( $w, $h ) = getimagesize ( $src ))
return "Unsupported picture type!";
$type = strtolower ( substr ( strrchr ( $src, "." ), 1 ) );
if ($type == 'jpeg')
$type = 'jpg';
switch ($type) {
case 'bmp' :
$img = imagecreatefromwbmp ( $src );
break;
case 'gif' :
$img = imagecreatefromgif ( $src );
break;
case 'jpg' :
$img = imagecreatefromjpeg ( $src );
break;
case 'png' :
$img = imagecreatefrompng ( $src );
break;
default :
return "Unsupported picture type!";
}
// resize
if ($crop) {
if ($w < $width or $h < $height) {
imagedestroy ( $img );
unset ( $img );
return "Picture is too small!";
}
$ratio = max ( $width / $w, $height / $h );
$h = $height / $ratio;
$x = ($w - $width / $ratio) / 2;
$w = $width / $ratio;
} else {
if ($w < $width and $h < $height) {
imagedestroy ( $img );
unset ( $img );
return "Picture is too small!";
}
$ratio = min ( $width / $w, $height / $h );
$width = $w * $ratio;
$height = $h * $ratio;
$x = 0;
}
$new = imagecreatetruecolor ( $width, $height );
// preserve transparency
if ($type == "gif" or $type == "png") {
imagecolortransparent ( $new, imagecolorallocatealpha ( $new, 0, 0, 0, 127 ) );
imagealphablending ( $new, false );
imagesavealpha ( $new, true );
}
imagecopyresampled ( $new, $img, 0, 0, $x, 0, $width, $height, $w, $h );
switch ($type) {
case 'bmp' :
imagewbmp ( $new, $dst );
break;
case 'gif' :
imagegif ( $new, $dst );
break;
case 'jpg' :
imagejpeg ( $new, $dst );
break;
case 'png' :
imagepng ( $new, $dst );
break;
}
imagedestroy ( $img );
imagedestroy ( $new );
unset ( $img );
unset ( $new );
return true;
}
Ну, у вас есть эта проблема, потому что вы должны изменить в php.ini
max_execution_time и memory_limit
Вы можете использовать тот, который вы хотите для ограничения памяти, либо изменить в php.ini или использовать ini_set
в php.ini
memory_limit = 128mb;
в вашем PHP-скрипте
ini_set('memory_limit','16M');
в .htaccess
php_value memory_limit 8M;
Примечание. Этот метод будет работать только в том случае, если PHP выполняется как модуль apache.
Других решений пока нет …