2013-04-16 36 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

您始终可以将数据作为查询字符串传递。 –