GD多个图像处理,如何处理内存错误?

时间:2012-01-31 15:36:23

标签: php memory memory-management gd

我在mysql数据库中有一些存储为BLOB的图像。

图像的最大文件大小为5MB。

我正在尝试使用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 个答案:

答案 0 :(得分:1)

您可以使用ini_set('memory_limit','128M');为当前脚本的运行时设置允许的内存大小但我觉得可能会有更深层次的隐藏。

答案 1 :(得分:0)

虽然增加脚本可用的内存并不是一个坏主意,实际上可能需要,但我想指出你只是在破坏$ uploaded_image。你还应该销毁$ thumb

那就是说,我自己经历过imagedestroy()的奇怪事情,而且我并不确定它是否完成了预期的所有工作。见my question on imagedestroy。不过,它似乎有助于循环,所以试试吧。