我在Windows Azure上托管了一个虚拟机,并在其上设置了LAMP堆栈。该网站允许用户创建相册和上传图像。这些图像存储在Windows azure blob存储中。由于图像可能很大,我将文件拆分为块,然后按如下方式上传:
$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个核心。
答案 0 :(得分:1)
PHP没有内置的多线程支持。
您可以使用John Lim发布的方法:
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处理。