GD несколько манипуляций с изображениями, как справиться с ошибкой памяти? - PullRequest
0 голосов
/ 31 января 2012

У меня есть несколько изображений в базе данных mysql, которые хранятся в формате BLOB.

Максимальный размер файла изображений составляет 5 МБ.

Я пытаюсь создать миниатюры изображений, используя php GD.

Я использую следующий сценарий:

include 'models/connectdb.php';

// ------ starting up ------ //

$directory = 'views/images/generated/events/xs/';
$table = 'events';
$dimension_x = 50;
$dimension_y = 50;


// ------- proccess ------- //

//$query = "ALTER TABLE $table ADD thumb0 VARCHAR(100);";
//$result = mysql_query($query) or die(mysql_error());
$query = "SELECT * FROM $table;";
$result = mysql_query( $query ) or die(mysql_error());
while( $row = mysql_fetch_array( $result ) ) {
    $id = $row['id'];
    $uploaded_image = base64_decode( $row['image'] );
    $uploaded_image = imagecreatefromstring( $uploaded_image );
    $uploaded_x = imagesx($uploaded_image);
    $uploaded_y = imagesy($uploaded_image);
    do{
       $filename = random_32();
       $filename = $directory.$filename.'.jpg'; 
    } while( file_exists($filename) );
       $thumb = imagecreatetruecolor( $dimension_x , $dimension_y );
       imagecopyresampled( $thumb , $uploaded_image , 0 , 0 , 0 , 0 , $dimension_x , $dimension_y , $uploaded_x, $uploaded_y);
       imagedestroy( $uploaded_image ); // I also tried unset( $uploaded_image );
       imagejpeg( $thumb , $filename , 90);
       $query = "UPDATE $table SET image_xs = '$filename' WHERE id = $id LIMIT 1;";
       mysql_query($query) or die(mysql_error());
       echo "ran for one , ";
    }
echo "it all ran";

function random_32() { // this function generates a random filename
    $filename = rand( 100000000000000000 , 999999999999999999 );
    $filename = md5( $filename );
    return $filename;
    }

Я получаю следующее:

ran for one ,
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 14032 bytes) in /home/leagu11/public_html/nightscene.gr/create_thumbs_people.php on line 21

Это означает, что мой сценарий выполняется для одного изображения и умирает, прежде чем будет запущен дляследующий.

Я думаю, что я делаю что-то не так с удалением / уничтожением моих данных после каждого выполнения цикла.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 31 января 2012

Вы можете ini_set разрешить размер памяти для времени выполнения текущего скрипта, используя ini_set('memory_limit','128M'); Но у меня есть ощущение, что там может быть что-то более глубокое, скрывающееся.

0 голосов
/ 06 сентября 2015

Хотя увеличение объема памяти, доступной для сценария, не является плохой идеей и, действительно, может быть необходимо, я хотел бы отметить, что вы уничтожаете только $ uploaded_image.Вы должны также уничтожить $ thumb

Тем не менее, я сам испытал странные вещи с imagedestroy (), и я не уверен, что он выполняет всю работу, которую он ожидал.См. мой вопрос по imagedestroy .Тем не менее, кажется, что это помогает в циклах, так что попробуйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...