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

I want to send an external MP4 file in chunks of 1 MB each to a user. With each chunk I update a database entry to keep track of the download progress. I use fread() to read the file in chunks. Here is the stripped down code:

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

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

  //do some database stuff

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

However, when I check the chunk size at some iteration inside the while loop, with

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

I do never get the desired chunk size. It fluctates somewhere around 7000 - 8000 bytes. Nowhere near 1024*1024 bytes. When I decrease the chunk size to a smaller number, for example 1024 bytes, it works as expected.

According to the PHP fread() manual:

"When reading from anything that is not a regular local file, such as streams returned when reading remote files or from popen() and fsockopen(), reading will stop after a packet is available."

In this case I opened a remote file. Apparently, this makes fread() stop not at the specified length, but when the first package has arrived.

I wanted to keep track of a download of an external file. If you to do this (or keep track of an upload), use CURL instead:

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
}