2011-12-14 4 views
0

Учитывая большой набор неупорядоченных изображений в формате jpg или png, я хотел создать PHP-скрипт, который сначала будет фильтровать все содержимое папки для разрешенных форматов, скопировать их в новую папку переименован в числовом порядке (1.jpg, 2.jpg, 3.jpg ..), создайте миниатюру размером 50 × 50 каждого изображения в папке «большие пальцы» дочерней папки, а затем создайте файл .html под названием «галерея», который содержит свалку Теги «img» каждого эскиза.PHP Неустранимая ошибка: допустимый размер памяти

Он работает нормально до десятка или около того, а затем превышает максимальную выделяемую память. Это внезапно произошло и появляется, когда вызывается функция imagecopyresized.

Любые советы приветствуются.

Источник:

<?php 

# Prepare vars 
$dir = "O:/zip/"; 
$newDir = "C:/Users/user/Desktop/zip/"; 
$thumbs = $newDir."thumbs/"; 
$gallery = $newDir."gallery.html"; 
$types = array(".jpg", ".png"); 
$files = array(); 
$tempFiles = scandir($dir); 
$i = 0; 

# Copy and rename images 
foreach($tempFiles as $file) 
{ 
    $thisType = substr($file,-4); 
    if(in_array($thisType, $types)) 
    { 
     $dest = fopen($newDir.$i.$thisType, 'w'); 
     fwrite($dest, file_get_contents($dir.$file)); 
     fclose($dest); 

     list($width, $height) = getimagesize($newDir.$i.$thisType); 
     $im = imagecreatetruecolor(50, 50); 
     if($thisType == '.jpg') 
     { 
      imagecopyresized($im, imagecreatefromjpeg($newDir.$i.$thisType), 0, 0, 0, 0, 50, 50, $width, $height); 
      imagejpeg($im, $thumbs.$i.$thisType); 
     } 
     else 
     if($thisType == '.png') 
     { 
      imagecopyresized($im, imagecreatefrompng($newDir.$i.$thisType), 0, 0, 0, 0, 50, 50, $width, $height); 
      imagepng($im, $thumbs.$i.$thisType); 
     } 
     imagedestroy($im); 

     $html .= "<a href='$newDir$i$thisType'><img src='$thumbs$i$thisType' alt='$i$thisType' width='50' height='50'></a>"; 
     print "Successfully processed $i$thisType<br>"; 
     $i++; 
    } 
} 
print "Done.<br>"; 

# Create html gallery for new imgs 
$dest = fopen($gallery, 'w'); 
fwrite($dest, $html); 
fclose($dest); 

print "There are ".number_format($i)." image files.\n\r"; 

?> 
+0

Вы пытались увеличить доступную память? – alex

+1

Я созерцал это, но я предпочел бы решить проблему с памятью, иначе мне пришлось бы увеличить лимит, чем больше изображений в исходной папке. – Lee

ответ

3

Ваш код выглядит нормально. Насколько велико 12-й образ, чем он больше других? Ознакомьтесь с документами для imagecopyresized() @ php.net, кто-то написал функцию setMemoryForImage(), которая определяет, будет ли текущий параметр php.ini для 'memory_limit' позволять изменять заданное изображение.

Это заставляет меня думать, что если исходное изображение слишком велико, оно будет исчерпывать память при попытке изменить размер.

+0

Я сбитый с толку, поскольку изображения всего лишь несколько сотен K. Я увеличил предел до 1024 и все ~ 500 изображений обрабатываются отлично. – Lee

+0

@Lee: Чем вы увеличили лимит? –

+0

По умолчанию это 16, что и заставляет меня поверить, что в моем методе должно быть что-то не так, учитывая массовые необходимые изменения. – Lee

1

Any advice is appreciated.

Ну, на первый взгляд, я не вижу утечку, но вы можете использовать memory_get_usage() для печати отладочную информацию, чтобы обнаружить ложь, которая не освобождает память.

Или это может быть просто одно исключительно большое изображение, вызывающее эту ошибку. Для этого случая yopu должен увеличить ограничение памяти.