我有一个托管在 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 个内核。