尝试在 php 中调整图像大小时如何处理此内存泄漏


How to deal this memory leak when try to resize image in php?

我尝试调整一个目录中所有图像的大小。我的代码工作找到,直到我尝试调整包含 70 张图片的目录大小。我已经使用图像销毁和取消设置。但我仍然失败了"致命错误:允许 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 中进行更改.inimax_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 模块执行时,此方法才有效。