PHP fread()块长度未正确考虑

时间:2014-05-04 15:36:41

标签: php size fread chunks

我想向用户发送一个1 MB的外部MP4文件。对于每个块,我更新数据库条目以跟踪下载进度。我使用fread()以块的形式读取文件。这是精简代码:

$filehandle = fopen($file, 'r');

while(!feof($filehandle)){
  $buffer = fread($filehandle, 1024*1024);

  //do some database stuff

  echo $buffer;
  ob_flush();
  flush(); 
}

但是,当我在while循环内的某个迭代中检查块大小时,使用

$chunk_length = strlen($buffer);
die("$chunk_length");

我永远不会得到所需的块大小。它大约在7000到8000字节之间波动。无处接近1024 * 1024字节。 当我将块大小减少到较小的数字时,例如1024字节,它按预期工作。

1 个答案:

答案 0 :(得分:1)

根据PHP fread()手册:

  

“从非常规本地文件的任何内容中读取,例如   读取远程文件或从popen()和   fsockopen(),数据包可用后读取将停止。“

在这种情况下,我打开了一个远程文件。显然,这会使fread()停止在指定的长度,但是当第一个包到达时。

我想跟踪外部文件的下载。 如果您这样做(或跟踪上传),请改用CURL:

curl_setopt($curl_handle, CURLOPT_NOPROGRESS, false);
curl_setopt($curl_handle, CURLOPT_PROGRESSFUNCTION, 'callbackFunction');

function callbackFunction($download_size, $downloaded, $upload_size, $uploaded){
  //do stuff with the parameters
}