PHP fread()块长度未正确计入帐户

PHP fread()块长度未正确计入帐户,php,size,fread,chunks,Php,Size,Fread,Chunks,我想向用户发送一个外部MP4文件,每个文件块大小为1MB。对于每个区块,我都会更新一个数据库条目,以跟踪下载进度。我使用fread()将文件分块读取。以下是简化的代码: $filehandle = fopen($file, 'r'); while(!feof($filehandle)){ $buffer = fread($filehandle, 1024*1024); //do some database stuff echo $buffer; ob_flush();

我想向用户发送一个外部MP4文件,每个文件块大小为1MB。对于每个区块,我都会更新一个数据库条目,以跟踪下载进度。我使用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字节)时,它会按预期工作。

根据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
}

你是以二进制模式打开的吗?不确定这是否是原因,但谁知道呢。是的,尝试以二进制模式打开,但没有改变行为。此处的“说明”部分描述了实际读取长度与请求长度不匹配的情况:-我猜情况4是怎么回事?根据第4个条件:“当读取非常规本地文件时,读取将在数据包可用后停止。”因此,从这一点我了解到,如果文件是远程的,则不可能读取超过1个数据包?无论如何,为什么要这样做?我不认为拆分下载有什么意义。