2012-11-05 84 views
1

我有很多圖像(500,000 +)在日期組織的服務器上的文件夾中。我製作了一個PHP腳本來複制和裁剪子文件夾(thumb)上的每個JPG文件,但由於PHP不支持多線程,所以速度很慢。快速調整大小圖片工具/腳本

我需要關於如何進行的建議。 Python是一個很好的選擇嗎?有沒有好的工具,或者我該如何改進我的調整大小功能?

您還可以看看我的PHP Code

+2

是多線程的,甚至要在這裏幫助嗎?除非你在時間上工作多個圖片,那就是。即使您要使用其他語言,您也必須利用多線程方面的優勢,它不會自動開始全部使用您的CPU。 – thatidiotguy

+0

下載它們處理它們並上傳它們? – Chris

+0

@Chris,我正在那樣做......但仍然很慢o.O –

回答

2

你可以在PHP中做到沒有任何問題,模擬線程,而不是直接使用它們。實際上,PHP沒有本地線程(你可以事件使用庫,但在你的情況下這不是很有用)。

在你的代碼,而不是調用:

static::Crop($file,$destination,$tn_w = 300,$tn_h =200,$quality = 100,$wmsource = false); 

爲什麼不這樣做:

$array = array($file, $destination, $tn_w = 300, $tn_h = 200, $quality = 100, $wmsource = 0); 
$command = "/usr/bin/php crop.php"; 
foreach ($array as $arg) 
{ 
    $command .= ' ' . escapeshellarg($arg); 
} 
exec("$command &"); // note the & which release your execution 
usleep(100000); 

,你把你的裁剪功能裏面crop.php,然後調用它像:

list($exec, $file, $destination, $tn_w, $tn_h, $quality, $wmsource) = $argv; 
static::Crop($file,$destination,$tn_w = 300,$tn_h =200,$quality = 100,$wmsource = false); 

這將完成這項工作。

如果您想避免睡眠並控制同時運行多少個作物,您也可以使用文件模擬互斥體,這真的取決於您。你絕對可以在PHP中做這樣的工作。

0

但是PHP CGI支持多線程。爲什麼不使用exec()?或者你可以使用shell腳本並進行轉換php cgi?

0

通過使用這個類

<?php 
class thumbnail_images { 

// get 
var $PathImgOld; 
var $PathImgNew; 
var $NewWidth; 
var $NewHeight; 

// tmp 
var $mime; 

function imagejpeg_new ($NewImg,$path_img) { 
    if ($this->mime == 'image/jpeg' or $this->mime == 'image/pjpeg') imagejpeg($NewImg,$path_img); 
    elseif ($this->mime == 'image/gif') imagegif($NewImg, $path_img); 
    elseif ($this->mime == 'image/png') imagepng($NewImg, $path_img); 
    else return(false); 
    return(true); 
} 

function imagecreatefromjpeg_new($path_img) { 
    if ($this->mime == 'image/jpeg' or $this->mime == 'image/pjpeg') $OldImg = imagecreatefromjpeg($path_img); 
    elseif ($this->mime == 'image/gif') $OldImg = imagecreatefromgif($path_img); 
    elseif ($this->mime == 'image/png') $OldImg = imagecreatefrompng($path_img); 
    else return(false); 
    return($OldImg); 
} 

function create_thumbnail_images() { 
    $PathImgOld = $this->PathImgOld; 
    $PathImgNew = $this->PathImgNew; 
    $NewWidth = $this->NewWidth; 
    $NewHeight = $this->NewHeight; 

    $Oldsize = @getimagesize($PathImgOld); 
    $this->mime = $Oldsize['mime']; 
    $OldWidth = $Oldsize[0]; 
    $OldHeight = $Oldsize[1]; 

    if ($NewHeight == '' and $NewWidth != '') { 
     $NewHeight = ceil(($OldHeight * $NewWidth)/$OldWidth); 
    } 
    elseif ($NewWidth == '' and $NewHeight != '') { 
     $NewWidth = ceil(($OldWidth * $NewHeight)/$OldHeight); 
    } 
    elseif ($NewHeight == '' and $NewWidth == '') { 
     return(false); 
    } 

    $OldHeight_castr = ceil(($OldWidth * $NewHeight)/$NewWidth); 
    $castr_bottom = ($OldHeight - $OldHeight_castr)/2; 

    $OldWidth_castr = ceil(($OldHeight * $NewWidth)/$NewHeight); 
    $castr_right = ($OldWidth - $OldWidth_castr)/2; 

    if ($castr_bottom>0) { 
     $OldWidth_castr = $OldWidth; 
     $castr_right = 0; 
    } 
    elseif ($castr_right>0) { 
     $OldHeight_castr = $OldHeight; 
     $castr_bottom = 0; 
    } 
    else { 
     $OldWidth_castr = $OldWidth; 
     $OldHeight_castr = $OldHeight; 
     $castr_right = 0; 
     $castr_bottom = 0; 
    } 

    $OldImg = $this->imagecreatefromjpeg_new($PathImgOld); 
    if ($OldImg) { 
     $NewImg_castr = imagecreatetruecolor($OldWidth_castr, $OldHeight_castr); 
     if ($NewImg_castr) { 
      imagecopyresampled($NewImg_castr, $OldImg, 0, 0, $castr_right, $castr_bottom, $OldWidth_castr, $OldHeight_castr, $OldWidth_castr, $OldHeight_castr); 
      $NewImg = imagecreatetruecolor($NewWidth, $NewHeight); 
      if ($NewImg) { 
       imagecopyresampled($NewImg, $NewImg_castr, 0, 0, 0, 0, $NewWidth, $NewHeight, $OldWidth_castr, $OldHeight_castr); 
       imagedestroy($NewImg_castr); 
       imagedestroy($OldImg); 
       if (!$this->imagejpeg_new($NewImg, $PathImgNew)) return (false); 
       imagedestroy($NewImg); 
      } 
     } 
    } 
    else { 
     return(false); 
    } 

    return(true); 
} 

} 
?> 

現在用它

$width = $_REQUEST['img_width']; 
$height = $_REQUEST['img_height']; 
// example 
$obj_img = new thumbnail_images(); 
$obj_img->PathImgOld = 'Old_image.jpg'; // Image for resize 
$obj_img->PathImgNew = 'my_image_new_formSubURLkki.jpg'; // New Image Path 
$obj_img->NewWidth = $width; 
$obj_img->NewHeight = $height; 
if (!$obj_img->create_thumbnail_images()) echo "error"; 
else { 
    echo 'Image Maked andsave in directory'; 
} 
+0

這只是一個算法,我將很快上傳完整的腳本來調整圖片大小。我在我的網站中使用了這個 http://hdwallpapershop.com –

+0

現在完成腳本被添加 –