2011-08-17 3 views
1

치명적인 오류 : 소진 33,554,432 바이트의 허용 메모리 크기 라인 에 /var/www/development/example/system/libraries/Image.php에 (4912 바이트를 할당하려고) 130.PHP 재건 이미지 : 메모리 사용

문제의 JPEG 이미지에는 특히 큰 파일 크기 (741KB)가 없습니다. 우리는이 동일한 코드를 사용하여 더 큰 이미지를 재구성했습니다. 그러나 이미지의 크기가 비정상적으로 커집니다 (4912x3264 픽셀). 이것이 효과가 있습니까?

PHP가 이미지를 재구성 할 때 메모리 사용을 결정하는 것은 무엇입니까? 파일 크기일까요? 치수는? 색 농도는? 파일 형식은 무엇입니까?

가 파산하는 줄은 내가 그 정도로 상황이라고 생각

$f1 = 'imagecreatefrom' . $tag; 
$src = $f1($file); 

했다. 이미지를 다시 만들려고 시도하지 않았습니다. 그것을 메모리에로드하는 것으로 충분했습니다.

+0

이미지를 만들 때 무엇을 사용하고 있습니까? gd, GraphicsMagick, ImageMagick 또는 다른 것? – Carpetsmoker

+0

달라 지겠지. 오류가 말하는 코드를 볼 수 있습니까? – Bojangles

+0

'memory_limit' php.ini 지시어. 32Mb로 설정했습니다.내가 잘못하고 있지 않다면 프로덕션 서버의 기본값입니다. 메모리 사용에 관해서 - 나는 위의 의견에 동의하며, 귀하가 그것을 구축하기 위해 무엇을 사용하고 있는지에 달려 있습니다. – J0HN

답변

2

riky가 말했듯이 가능한 한 메모리 제한을 높게 설정하십시오. 또한 크기가 파일 크기보다 더 중요하다는 사실을 인식하십시오 (파일 크기는 압축 된 이미지 용임). GD에서 이미지를 열면 모든 픽셀에 3 ~ 4 바이트의 RGB와 A가 할당됩니다. 따라서 4912 픽셀 x 3264 픽셀 이미지는 48,098,304에서 64,131,072 바이트의 메모리를 사용해야하며 오버 헤드와 다른 메모리가 있습니다. 스크립트가 사용 중입니다.

+0

좋은 의견이지만, 픽셀 색상을 표현하는 다양한 형식이 많이 있기 때문에 RGB (A) 대신 bpp (픽셀 당 비트)를 사용해야한다고 생각합니다. 그냥 nitpicking. – XzKto

+0

나는 전에 이런 종류의 문제를 겪었고 사람들은 RGB (A)를 더 잘 이해하는 경향이 있지만 픽셀 당 비트는 더 정확하고 아마 더 정확할 것입니다. – steveo225

0

그것은 당신도 구현 의존에 .htacess

또는 ini_set('memory_limit','64M');에 메모리 버퍼 크기

php_value memory_limit 64M을 높입니다. 마지막으로 내가 500,000 개가 넘는 레코드로 CSV 파일을 작업 할 때 같은 메시지가 나타납니다. 나중에 클래스를 소개하고 열린 객체를 닫으려고합니다. 그것 memeory 소비를 감소시킨다. 이미지를 열고 편집하는 경우. 그것은 메모리에로드 중임을 의미합니다. 그 경우에는 크기가 중요합니다. 여러 이미지를 조작하는 경우. 이미지 당 하나씩 기록한 다음 해당 이미지를 닫습니다. 내 경험으로는 자르기 표시를 확인하기 위해 pdf 아트웍 파일을 작업 할 때였습니다. 같은 오류가 발생했습니다.

//you can set the memory limits values 
// in htaccess 
php_value memory_limit 64M 
//or in you using following in php 
ini_set('memory_limit', '128M'); 
//or update it in your php.ini file 

그러나 코드를 최적화하면. 객체 지향 aproach를 사용하면 메모리 소비가 매우 적습니다. 왜냐하면 모든 물체가 그 범위를 가지고 있고 그 범위에서 벗어나 파괴되기 때문입니다.

0

사용 된 메모리의 크기는 크기와 색상 비트 깊이에 따라 다릅니다. 사진 작가를위한 포트폴리오 웹 사이트를 구축하는 동안 나는 몇 년 전에 그 문제를 해결했습니다. 이 문제를 올바르게 해결할 수있는 유일한 방법은 이미지 라이브러리를 GD에서 imagick으로 전환하는 것입니다. Imagick은 메모리를 훨씬 적게 소비하며 PHP 메모리 제한에 묶이지 않습니다.

사진 작가가 업로드 한 이미지는 최대 30MP입니다. 그리고 메모리 제한을 1024MB 이상으로 설정하는 것은 내 눈을 감추지 않습니다.