多个访问者查看产品目录时的内存不足问题

时间:2013-09-17 09:08:16

标签: php

第一个问题,对不起,如果我做错了什么!

我的问题是,我有一个产品目录,在产品目录中最多可显示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();

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

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

这种方法比在运行中创建它们更好。

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

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

答案 1 :(得分:0)

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

enter image description here