2014-02-24 88 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 .. –