我想向用户发送一个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字节,它按预期工作。
答案 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
}