请看下面的PHP代码。它来自下载脚本:
while(ob_get_level() > 0){
ob_end_clean();
}
set_time_limit(0);
ignore_user_abort(true);
$file = fopen(MATIN_FILE_PATH,"rb"); // the main file
$chunksize = 2*1024*1024;
while(!feof($file)){
echo @fread($file, $chunksize);
flush();
if (connection_status() == 1){ // if client aborted
@fclose($file);
exit;
}
}
@fclose($file);
exit;在这段代码中,您可以看到我每块发送2MB。想象一下一个速度为100 of /s的客户端。
经过多次调试后,我发现当客户端下载每个2MB时,fwrite就会发生,while会转到下一个循环。那么,此时PHP在做什么呢?是在等待用户完全下载2MB,然后再发送2MB吗?那么,我发送10 it或50 it的数据不是更好吗?
谢谢您的详细指导。
发布于 2015-08-21 11:31:15
假设您有10个同时使用此脚本下载某些文件的客户端请求,并且设置了每块大小50 per。对于每个请求,将调用一个新的php进程,每个请求都需要50 to的服务器内存来处理fread($file, 50*1024*1024)。因此,您将消耗500 So的内存。
如果像您建议的那样,客户端速度为100 of /s,那么您拥有100个同时连接的概率并不低,您可以得到100个并发请求,即已经有5GB的RAM。你有那么多钱还是需要这么多?
您不能让用户比他的实际下载速度更快地下载文件,因此块大小对此并不重要。这两种方法都不会减少循环迭代的次数,这将有助于加快速度。我还没有对此进行测试,但我认为循环的执行速度比远程客户端的I/O操作要快。因此,您真正应该关心的是使您的服务器可靠地工作。
https://stackoverflow.com/questions/32138422
复制相似问题