2009-11-14 4 views
1

최대 10MB의 파일에 대해 단일 이미지 업로드/자르기/크기 조정 스크립트를 사용하고 있습니다.PHP 메모리 제한 25MB 소모 - 파일 업로드/자르기/크기 조정

테스트 할 때 php_ini 메모리 제한을 25M로 설정했는데 약 1.4MB의 파일 만 업로드 할 때이 용량이 모두 소모되었습니다.

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

이것은 이상한 것 같습니다. 10368 < 26214400? (수사학상의 질문)

나는 2568MB 이상에 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); 
    } 
} 
+1

다른 10368 바이트를 할당하는 동안 방금 메모리 제한에 도달했습니다. 우리가 당신을 도울 수 있도록 몇 가지 코드를 보여주십시오. – Gumbo

+0

귀하의 의견을 보내 주셔서 감사합니다. 코드는 –

+0

으로 게시됩니다. 최선의 답변을 결정하기가 정말 어렵습니다. 감사!! –

답변

4

오류 메시지가 다른 10,368 바이트를 할당하려고하지만, 사용할 수없는 것을 말한다. 다시 말해, 25MB 풀이 고갈되었고 스크립트가 필요한 10368 바이트를 할당하지 못했습니다.

당신은 추가하거나 다음과 유사한 라인을 업데이트하여, 당신의 php.ini 파일에서이 제한을 늘릴 수 있습니다

memory_limit = 64M 

을 지금까지 "25메가바이트 충분한 경우,"우리에게 어려운 질문이다 것과 대답 ... 합법적으로 64MB 이상을 필요로하는 스크립트가 있습니다. 메모리 풀의 크기를 지속적으로 늘려야 만한다면, 많은 공간을 차지하는 것을 조사하기 시작할 것입니다.

Here is a related question 메모리 풀의 크기에 대해 충분한 논의가 있습니다.

수정 코드를 게시하면 이미지로 작업 할 때 많은 양의 메모리를 사용할 수 있습니다. 이미지 리소스를 다 마친 후에는 imagedestroy으로 전화하여 스크립트를 도울 수 있습니다.

1

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

2

아니면 25MB가 넘는 10368 바이트를 의미합니까?

아니요 스크립트는 10,368 바이트를 할당하려고했다 10,368 + alreadyallocated> 25메가바이트

내 스크립트이 많은 메모리를 사용 하는가?

크기 조정에 GD를 사용하는 경우 예. 다른 libs 또는 이미지 처리를위한 콘솔 도구를 사용하려고하면 더 많은 성능을 제공 할 수 있습니다. 그리고, 당신은 이미지 처리를 위해 큐를 사용하고 공개 웹 사이트

+0

나는 이것을 들여다 보겠습니다. 감사합니다. –

2

사용 imagedestroy는 사용 후 메모리를 해제 할 수 있는지, 적시 (just-in-time) 이미지 크기를 조정하지 결정할 수 있습니다 :

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); 
} 
+0

달콤한, 이것으로 인해 제 메모리 사용량이 다소 줄었습니다. 나는이 질문을 가진 다른 사람들에게주의를 기울여야하며, 적절한 구문은 imagedestroy ($ new_image)이다; 감사합니다. –

+0

@ Paul Silvis : 감사합니다. 다행히 PHP.net은 실제로'image_destroy'를 입력 할 때 올바른 기능을 보여주었습니다. – Gumbo

14

또한 무엇을 이미 말한 바 있습니다 :

JPEG와 같은 압축 파일 형식 처리에는 실제 파일 크기보다 훨씬 많은 메모리가 필요합니다.3000 x 3000 픽셀 JPG 파일의 크기는 500kb에 불과하지만 3000 x 3000 x 3 (Red, Green 및 Blue의 경우 각각 1 바이트, Alpha의 경우 모드에 따라 하나씩 더 필요) = 27MB 이상 .

+0

고마워요, 이것은 정말로 "받아 들일 수있는"효율성을 집중적으로 평가합니다. –

+0

+1 디버거를 통해 그의 코드를 실행했을 때 그는'$ imgcreatefrom ($ updir. $ img);에서 폭탄을 터뜨릴 것입니다 (만약 그 줄이 아직 붙여지지 않은 오류 메시지의 일부로 표시되지 않았다면). – timdev