Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

piotrekn

[PHP] Brak pamięci przy tworzeniu miniatur

Polecane posty

Mam mały problem z PHPowym skryptem.

Potrzebuję wygenerować 1488 miniatur i chciałem do tego zaprząc skrypt PHP. Za radą znajomego zrezygnowałem z Imagicka (dającego mi jedną-dwie funkcje na stworzenie miniatury z dopasowaniem wymiarów) i użyłem GD2. Żeby nie produkować zbędnego kodu zrobiłem nawet sobie funkcję et caetera et caetera...


function parseToThumbnail($sourceImg, $thumbWidth, $thumbHeight = 0)
{
if($thumbHeight == 0) $thumbHeight = $thumbWidth;
$width = imagesx($sourceImg);
$height = imagesy($sourceImg);
$ratio = $width/$height;
if($thumbHeight*$ratio>$thumbWidth) $thumbHeight = floor($thumbWidth/$ratio);
else $thumbWidth = floor($thumbHeight*$ratio);
$thumb = imagecreatetruecolor($thumbWidth,$thumbHeight);
imagecopyresized($thumb,$sourceImg,0,0,0,0,$thumbWidth,$thumbHeight,$width,$height);
return $thumb;
}
$allowedTypes = array("png", "jpg", "gif", "jpeg");
if(isset($_GET['mode']))
{
switch($_GET['mode'])
{
case "thumbs":
$dirHandle = opendir("./pix");
while (false !== ($entry = readdir($dirHandle)))
{
$finfo = pathinfo("./pix".$entry);
if (is_file("./pix/".$entry) && in_array(strtolower($finfo['extension']), $allowedTypes))
{
switch($finfo['extension'])
{
case "png":
$img = imagecreatefrompng("./pix/".$entry);
$th = parseToThumbnail($img,200);
imagepng($th,"./pix/thumbs/".$entry);
imagedestroy($th);
imagedestroy($img);
break;
case "jpg":
$img = imagecreatefromjpeg("./pix/".$entry);
$th = parseToThumbnail($img,200);
imagejpeg($th,"./pix/thumbs/".$entry);
imagedestroy($th);
imagedestroy($img);
break;
case "jpeg":
$img = imagecreatefromjpeg("./pix/".$entry);
$th = parseToThumbnail($img,200);
imagejpeg($th,"./pix/thumbs/".$entry);
imagedestroy($th);
imagedestroy($img);
break;
case "gif":
$img = imagecreatefromgif("./pix/".$entry);
$th = parseToThumbnail($img,200);
imagegif($th,"./pix/thumbs/".$entry);
imagedestroy($th);
imagedestroy($img);
break;
}
}
}
closedir($dirHandle);
break;
}
}

To tak w dużym skrócie. Próba wykonania tegoż skutkuje komunikatem o wyczerpaniu pamięci w zatrważającej ilości 128MB w linii 89 (czyli przy próbie wepchnięcia nowego obrazka do obróbki), zaś w katalogu docelowym znajduję wykonane 32 miniatury, zatem skrypt do przodu idzie. Gdzie popełniam jeszcze błąd przy zwalnianiu pamięci? Nie mogę się pozbyć obrazka źródłowego w ramach zadeklarowanej funkcji, a wyrzucanie po każdej iteracji wczytanego obrazka oraz jego miniatury nic nie daje.

Link do komentarza
Udostępnij na innych stronach

Problem się rozwiązał, a w zasadzie okazało się, że żadnego problemu nie ma - po prostu grafika była zbyt duża po dekompresji. Dodałem do kodu linijki zwiększające dostępną pamięć i przedłużające maksymalny czas wykonywania.

Temat do zamknięcia.

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...