好的,所以我试图以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.我很困惑,为什么会发生这种情况?
答案 0 :(得分:2)
php://input是一个只读流。来自fread
如果流被读缓冲并且它不表示普通文件,则最多读取一个等于块大小(通常为8192)的字节数;取决于先前缓冲的数据,返回数据的大小可能大于块大小。
php:// input是一个缓冲流,不代表普通文件。 fread
一次读取一个块(8192个字节)。
文件大小/ chucks =读取循环次数
93335/8192 = 11.4