2013-04-16 35 views
0

我有一個託管在Windows Azure上的虛擬機,並在其上設置了一個LAMP堆棧。該網站允許用戶創建相冊並上傳圖片。這些圖像存儲在Windows azure blob存儲中。正如圖片可大了,我分裂文件成塊,然後將它們上傳如下:PHP中的並行線程

$blockMaxSize = 2*1024*1024; //2MB 
      $fileSize = $_FILES['Filedata']['size']; 
      $numOfBlocks = $fileSize/$blockMaxSize; 
      $currentFileIndex = 0; 
      $blockId=1; 
      $blocklist = new BlockList(); 
      while($numOfBlocks>0) 
      { 
       $content = file_get_contents($_FILES['Filedata']['tmp_name'],NULL,NULL,$currentFileIndex,$blockMaxSize); 
       $currentFileIndex+=$blockMaxSize; 
       $numOfBlocks-=1; //Read the current block. 

       //upload the block 
       $blobRestProxy->createBlobBlock(Actual_Image, $blobName, md5($blockId),$content); 
       $blocklist->addLatestEntry(md5($blockId)); 
       $blockId++; 
      } 

      $blobRestProxy->commitBlobBlocks(Actual_Image, $blobName, $blocklist->getEntries()); 

這可能會花費大量的時間進行一個文件,該文件是大於5MB的左右。我正在尋找方式或執行並行上傳到blob存儲,以加快上傳速度。我正在創建一個包含文件數據,然後並行上傳這些內容的$ content數組。我讀了exec和* pcntl_fork *但fork在服務器上是禁用的,我不確定我是否可以使用exec來執行命令。

是否有可能在PHP中做到這一點?也許使用POSIX線程。

不確定是否需要此信息,但虛擬機有4個內核。

回答

1

PHP沒有內置的多線程支持。

可以使用的方法,如一個作者:John林雖然:

http://phplens.com/phpeverywhere/?q=node/view/254

不是很強勁,但它應該得到你有點多任務。

看到這個代碼有

if (1) { /* SAMPLE USAGE BELOW */ 

$fp1 = JobStartAsync('localhost','/jobs/j1.php'); 
$fp2 = JobStartAsync('localhost','/jobs/j2.php'); 


while (true) { 
    sleep(1); 

    $r1 = JobPollAsync($fp1); 
    $r2 = JobPollAsync($fp2); 

    if ($r1 === false && $r2 === false) break; 

    echo "<b>r1 = </b>$r1<br>"; 
    echo "<b>r2 = </b>$r2<hr>"; 
    flush(); @ob_flush(); 
} 

echo "<h3>Jobs Complete</h3>"; 
} 

您可以添加文件,像這樣parallal處理。

+0

這看起來不錯,但有沒有辦法讓我將參數傳遞給這些文件?我需要將內容和ID信息傳遞給他們,以便他們有數據上傳。 – Saurabh

+0

您始終可以將數據作爲查詢字符串傳遞。 –