好的,所以我正在尝试以 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。我很困惑,为什么会这样?
只读流。 从恐惧
如果流是读取缓冲的,并且它不表示纯文件,则最多读取一次最多等于块大小(通常为 8192)的字节数;根据先前缓冲的数据,返回数据的大小可能大于块大小。
php://input 是一个缓冲流,不代表纯文件。 fread
一次读取一个块(8192 字节)。
文件大小/卡盘 = 读取周期计数
93335/8192 = 11.4