2014-02-24 37 views
0

所以,我有一个脚本来调整大小,保存一个gif并在我的服务器上保存这个gif的预览图像。上传脚本太长,无法执行

这是我的脚本:

public function createImageGif($gif, $x, $y, $w, $h) 
    { 
     $image = new Imagick(); 
     $decoded = base64_decode($gif); 
     $image->readimageblob($decoded); 
     $image = $image->coalesceImages(); 

     $image_name = uniqid(rand()).'.gif'; 

     foreach ($image as $frame) { //gif creation 
      $frame->cropImage($w, $h, $x, $y); 
      $frame->thumbnailImage(117, 135); 
      $frame->setImagePage(117, 135, 0, 0); 
     } 

     $image = $image->deconstructImages(); 
     $image->writeImages('uploads/profiles/'.$image_name, true); 

     //preview creation 
     $im = imagecreatefromstring($decoded); 
     if ($im !== false) { 
      header('Content-Type: image/gif'); 
      $newimage = imagecreatetruecolor(117, 135); 
      imagecopyresampled($newimage, $im, 0, 0, $x, $y, 117, 135, $w, $h); 
      imagegif($newimage, 'uploads/profiles-preview/'.$image_name.'', 100); 
      imagedestroy($newimage); 
      imagedestroy($im); 
     } 

     return $image_name; 
    } 

所以,$gif是在第一长字符串BLOB(约2 000 000个字符)。最后,我的服务器上的gif大小约为300ko。

该脚本需要20多秒才能执行。我有一个良好的连接和一个很好的服务器。

如何优化此脚本?有任何想法吗 ?

编辑:这是我的脚本在JavaScript创建我的数据:

+0

您好Clément。你可以放入一些断点并接近代码的“挂起”部分。这可能会使您更容易帮助您改进代码。如果你无法做出断点,你可以做一些回声1;出口;并且将代码“挂起”的地方修饰一番。 –

+0

哼,我的问题不在我的PHP脚本中,而是在我的ajax请求中。我试图发送一个非常大的字符串与jquery ajax(在我的编辑img.src)。所以,问题是ajax –

回答

-1

为什么你的脚本使用编码输入一个blob binary64?做这件事有很多合理的理由,但你确定这是必要的吗?你不能只从PHP temp文件夹加载图像吗?

也许,你从一个JavaScript函数的图片上传,通过Ajax,基地-64编码的图像(从画布动态创建?),并在之后的参数发送它作为一个字符串

而且,我发现你先保存你的图片,然后重新打开它,以便将回复发送回客户端。你为什么不发回你刚刚调整大小的图像(包含在$ image变量中的图像)

+0

$ gif是使用javascript创建的,来自网络摄像头;)并且我还没有理解你的第三点.. –

+0

忘记第三点,我没有仔细阅读你的代码。我的错。我在一年前遇到了同样的问题,同时使用jQuery库截取相机的截图,我仍然记得我的代码中存在什么问题:将图像从javascript编码到服务器!你是否发送以base_64编码的图像,连接像素的所有8位值?这可以解释为什么你的图像在到达服务器之前会从300k到2M爆炸。这个转换是*问题放慢了整个事情 – morepaolo

+0

所以,我需要做什么?现在,我把src一个base64data .. –