0

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

4

1 回答 1

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>";
}

您可以像这样添加文件以进行并行处理。

于 2013-04-16T09:44:09.153 回答