PHP详细信息

时间:2015-08-21 10:47:52

标签: php fread

请查看下面的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;

在此代码中,您看到我每块发送2 MB。 想象一下速度为100kb / s的客户 经过多次调试,我发现当客户端下载每个2MB时,fwrite发生,while进入下一个循环。那么,PHP目前在做什么?它是在等待用户完全下载2MB然后再发送2MB?所以,我每块发送10MB或50MB是不是更好? 感谢您提供详细的指南。

1 个答案:

答案 0 :(得分:0)

想象一下,您有10个同时使用此脚本下载某个文件的客户端请求,并且每个块大小设置了50MB。对于每个请求,将调用一个新的php进程,每个进程都需要50MB的服务器内存来处理fread($file, 50*1024*1024)。因此,您将消耗500MB内存。

如果按照你的建议,客户端速度是100kb / s,那么你有100个并发连接的概率不是那么低,你可以获得100个并发请求,这已经是5GB的RAM。你有那么多或需要这一切吗?

您无法让用户以比实际下载速度更快的速度下载文件,因此块大小对此并不重要。减少循环次数迭代都不会有助于加快速度。我没有测试过这个,但我认为,循环的执行速度比使用远程客户端的I / O操作要快。因此,您唯一应该关注的是让您的服务器可靠地工作。