首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP详细介绍

PHP详细介绍
EN

Stack Overflow用户
提问于 2015-08-21 10:47:52
回答 1查看 343关注 0票数 0

请看下面的PHP代码。它来自下载脚本:

代码语言:javascript
复制
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的数据不是更好吗?

谢谢您的详细指导。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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操作要快。因此,您真正应该关心的是使您的服务器可靠地工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32138422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档