문제

최대 10MB의 파일에 대한 단일 이미지 업로드/작물/크기 스크립트를 사용하고 있습니다.

테스트 할 때 PHP_INI 메모리 제한을 25m로 설정했으며 파일을 약 1.4MB 만 업로드 할 때 소진됩니다.

"Allowed memory size of 26214400 bytes exhausted (tried to allocate 10368 bytes)"

이것은 나에게 이상해 보인다. 10368 <26214400이 아님? (수사적 질문)

아니면 25MB 이상 10368 바이트를 갔다는 것을 의미합니까? 내 스크립트 가이 많은 메모리를 사용해야합니까?

암호:

function make_thumbnails($updir, $img)
{
    $thumbnail_width    = 200;
    $thumbnail_height   = 150;
    $thumb_preword  = "thumb_";

    $arr_image_details  = GetImageSize($updir.$img);
    $original_width = $arr_image_details[0];
    $original_height    = $arr_image_details[1];

    if( $original_width > $original_height ){
        $new_width  = $thumbnail_width;
        $new_height = intval($original_height*$new_width/$original_width);
    } else {
        $new_height = $thumbnail_height;
        $new_width  = intval($original_width*$new_height/$original_height);
    }

    $dest_x = intval(($thumbnail_width - $new_width) / 2);
    $dest_y = intval(($thumbnail_height - $new_height) / 2);

    if($arr_image_details[2]==1) { $imgt = "ImageGIF";  $imgcreatefrom = "ImageCreateFromGIF";  }
    if($arr_image_details[2]==2) { $imgt = "ImageJPEG"; $imgcreatefrom = "ImageCreateFromJPEG";  }
    if($arr_image_details[2]==3) { $imgt = "ImagePNG";  $imgcreatefrom = "ImageCreateFromPNG";  }

    if( $imgt )
    {
        $old_image = $imgcreatefrom($updir.$img);
        $new_image = imagecreatetruecolor($thumbnail_width, $thumbnail_height);
        imageCopyResized($new_image,$old_image,$dest_x,
        $dest_y,0,0,$new_width,$new_height,$original_width,$original_height);
        $imgt($new_image,$updir.$thumb_preword.$img);

        // Added by your suggestions:
         imagedestroy($old_image);
         imagedestroy($new_image);
    }
}
도움이 되었습니까?

해결책

오류 메시지에 따르면 다른 10368 바이트를 할당하려고했지만 사용할 수 없었습니다. 다시 말해, 25MB 풀이 소진되었고 스크립트는 필요한 10368 바이트를 할당 할 수 없었습니다.

이 한도를 늘릴 수 있습니다 php.ini 파일, 다음과 유사한 줄을 추가하거나 업데이트하여 :

memory_limit = 64M

"25MB가 충분하다면"우리가 대답하기 어려운 질문입니다 ... 64MB 이상의 합법적으로 필요한 스크립트가 있습니다. 메모리 풀의 크기를 지속적으로 늘려야한다는 것을 알게되면 공간이 너무 많은 것을 살펴보기 시작합니다.

여기 관련 질문이 있습니다 그것은 메모리 풀의 크기에 대한 좋은 논의가 있습니다.

편집하다 코드가 게시 된 것을보고 이미지로 작업 할 때 많은 양의 메모리를 소비 할 수 있습니다. 전화를 통해 대본을 도울 수 있습니다 imagedestroy 이미지 리소스를 완료 한 후.

다른 팁

이미 말한 것 외에도 :

JPEG와 같은 압축 파일 형식을 처리하려면 실제 파일 크기보다 훨씬 더 많은 메모리가 필요하다는 것을 잊지 마십시오. 3000 x 3000 픽셀 JPG 파일의 무게는 500kb에 불과하지만 3000 x 3000 x 3 (대략) 3000 x 3000 x 3 (적색, 녹색 및 파란색의 경우 각각 1 바이트, 알파의 경우 모드에 따라) = 최소 27MB가 필요합니다. .

사용 imagedestroy 사용 후 메모리를 제거하려면 :

if( $imgt )
{
    $old_image = $imgcreatefrom($updir.$img);
    $new_image = imagecreatetruecolor($thumbnail_width, $thumbnail_height);
    imageCopyResized($new_image,$old_image,$dest_x,
    $dest_y,0,0,$new_width,$new_height,$original_width,$original_height);
    imagedestroy($old_image);
    $imgt($new_image,$updir.$thumb_preword.$img);
    imagedestroy($new_image);
}

아니면 25MB 이상 10368 바이트를 갔다는 것을 의미합니까?

아니요. 스크립트는 10368 바이트, 10368 + 이미 할당> 25MB를 할당하려고했습니다.

내 스크립트 가이 많은 메모리를 사용해야합니까?

크기 조정을 위해 GD를 사용하는 경우 예입니다. 이미지 처리를 위해 다른 LIB 또는 콘솔 도구를 사용하려고 노력하면 더 많은 성능을 줄 수 있습니다. 또한 이미지 처리에 큐를 사용하기로 결정하고 공개 웹 사이트 인 경우 이미지를 바로 크기를 조정하지 않기로 결정할 수 있습니다.

즉, 한계를 초과 한 순간, 스크립트가 10368 바이트를 할당하려고했지만 성공하지 못했습니다. 그렇다고 한계를 26MB로 늘리면 더 이상이 문제가 없다는 것을 의미하지는 않습니다. 나중에 오류가 발생할 수 있습니다. 더 이상이 오류가 발생하지 않을 때까지 작은 단계 (예 : 32MB, 48MB 등)로 늘릴 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top