0

第一个问题,如果我做错了什么,很抱歉!

我的问题是,我有一个产品目录,它在产品目录中最多显示 18 个缩略图,每个大约 6kb。每个缩略图调用一个脚本 get_db_image 来搜索并返回与产品相关的图像。很简单,到目前为止。仅当对产品目录页面同时发出大约 3 或 4 个请求时才会出现此问题,每个用户都希望返回 18 个缩略图和详细信息,但是当他们都同时进行时,我会出现内存不足错误有时服务器崩溃。我已经剥离了检索和显示图像的代码,并且托管人员将内存限制提高到了 256M,但这一切都无济于事。据我所知,我正在销毁我创建的图像,并且在发出请求后虚拟内存会回到零分秒,但是在高峰期,所有内存都被利用了,因此崩溃了,所以我唯一能想到的就是在开始下一张之前获取、显示和销毁每张图像,但我不知道该怎么做,但也许有更好的解决方案?请帮忙,把我的头发拉出来,我没有太多可浪费的了!

    // executes the query searching for the image
$res = execPDORetRes($query, $vars);

// if there is no image, load a default
if(sizeof($res) == 0)
{
    $query_parts = explode(" ", $query);
    $query = "select * from ".$query_parts[3]." where id = :id";
    $vars = array(':id-int' => 1);
    $res = execPDORetRes($query, $vars);    
}
$data = $res[0];

// create the image from the DB
$img = imagecreatefromstring($data[$name]); 

$type = "image/pjpeg";

Header( "Content-type: image/pjpeg"); 

$width = imagesx($img); 
$height = imagesy($img);

// if the image is too big
if($size_w != $width || $size_h != $height)
{
    // set widths and heights
    if ($width <= $size_w) 
    {
        $new_w = $width;
        $new_h = $height;
    } 
    else 
    {
        $new_w = $size_w;
        $new_h = $size_h;
    }

    // create a new image of the specified width and height
    $new_img = imagecreatetruecolor($new_w,$new_h); 

    // resize the original 
    imagecopyresized($new_img,$img,0,0,0,0,$new_w,$new_h,$width,$height);

    // determine image type and send it to the client    
    imagejpeg($new_img,"","80"); 

    // clear the image from memory
    imagedestroy($new_img); 
    imagedestroy($img);         
    unset($width, $height, $new_h, $new_w, $new_img, $img);
}
else
{
    // if the image is smaller than or the right size
    // determine image type and send it to the client    
    imagejpeg($img,"","80"); 

    // clear the image from memory
    imagedestroy($img); 
    unset($width, $height, $img);
}

ob_flush();

谢谢您的帮助。

4

2 回答 2

2

我认为如果你想这样的话,你应该提前生成你的缩略图。这意味着您应该在“public/images/products/main”下放置您的普通产品图片,然后在“public/images/products/thumbs”下放置您的拇指,然后将产品图片和拇指的路径存储在数据库中。

这种方法比动态创建它们更好。

否则,如果带宽不是问题,您可以使用 css 缩小它们,但我想它是。

如果缩略图存在,您甚至可以保留您的拇指脚本并检查数据库,如果不存在,则调用您的脚本:生成拇指,保存拇指,更新数据库。下次用户来并且您需要显示此缩略图时,它已经存在了。

于 2013-09-17T09:19:11.237 回答
0

256 MB 应该足够了。您的代码中没有任何内容看起来很糟糕,您甚至还在使用unset. 我建议使用 Xdebug 和 WinCacheGrind 进行调试,它们可以生成深入的日志...

在此处输入图像描述

于 2013-09-17T09:17:22.663 回答