以块的形式读取文件,奇怪的循环

时间:2013-12-23 15:53:57

标签: php file stream xmlhttprequest

好的,所以我试图以1048576字节(1 MB)的块来读取一个91kb的文件,它应该在一个块中即时读取文件,但这不是我得到的

public function uploadTmpFileFromXHRStream(){
    header('Content-type: text/html; charset=utf-8');
    function output($val)
    {
        echo $val;
        flush();
        ob_flush();
    }

    $in = fopen('php://input', 'r');
    $tmpFileId = uniqid(null,true);
    $out = fopen($tmpFileId.'_'.$_SERVER['HTTP_X_MFXHRFILEUPLOAD'], 'x');
    while($data = fread($in,1048576)){
        fwrite($out, $data);
        output(1);
        sleep(2);
    }

}

另一方面,我设置了javascript来监听xhr.readystatechange readyState==3,只是将输出记录到控制台。我在控制台中拥有的是:

200 OK 24,02s   
1
11
111
1111
11111
111111
1111111
11111111
111111111
1111111111
11111111111
111111111111

while循环中有12次迭代,php://input的确切文件大小为93335.我很困惑,为什么会发生这种情况?

1 个答案:

答案 0 :(得分:2)

php://input是一个只读流。来自fread

  

如果流被读缓冲并且它不表示普通文件,则最多读取一个等于块大小(通常为8192)的字节数;取决于先前缓冲的数据,返回数据的大小可能大于块大小。

php:// input是一个缓冲流,不代表普通文件。 fread一次读取一个块(8192个字节)。

文件大小/ chucks =读取循环次数

93335/8192 = 11.4