PHP中的并行线程

时间:2013-04-16 09:42:13

标签: php parallel-processing

我在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个核心。

1 个答案:

答案 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处理。