如何在php中限制file_put_contents的速度?

时间:2014-11-13 16:42:01

标签: php download

我有以下用于将网络文件直接下载到我的网络服务器的PHP代码:

function fileDownload()

{

    $url = $_POST['downloadlink'];

    $filename = $_POST['filename'];

    $dir = "downloads/";

    $filepath = $dir . $filename;

    file_put_contents($filepath, fopen($url, 'r'));

}

上面的php函数适用于下载小于128 mb的文件,但是当文件大小超过128 mb时,我的服务器上的流量负载很大,我的服务器暂时不可用并中止所有连接。所以,我的文件下载中止了。我在想是否有办法限制file_put_contents功能的速率,这样即使我下载的文件大于128 mb,我的服务器也能正常工作。

1 个答案:

答案 0 :(得分:0)

您可以注册一个可能会限制费率的stream filter。一个token bucket。我为你做了所有这些:bandwidth-throttle/bandwidth-throttle

但是您只能在流(即文件句柄)上注册该过滤器。如果是file_put_contents(),则必须将其注册到输入流:

use bandwidthThrottle\BandwidthThrottle;

$in = fopen($url, 'r');

$throttle = new BandwidthThrottle();
$throttle->setRate(100, BandwidthThrottle::KIBIBYTES); // 100KiB/s
$throttle->throttle($in);

file_put_contents($filepath, $in);

如果要限制输出流,则必须使用在流上写入的方法,例如: stream_copy_to_stream()

use bandwidthThrottle\BandwidthThrottle;

$in  = fopen($url, 'r');
$out = fopen($filepath, 'w');

$throttle = new BandwidthThrottle();
$throttle->setRate(100, BandwidthThrottle::KIBIBYTES); // 100KiB/s
$throttle->throttle($out);

stream_copy_to_stream($in, $out);

实际上,两种解决方案之间没有太大区别。两者都将以100KiB / s进行读写。您可能需要为该脚本调整max_execution_time

顺便说一句。不要将$_POST用于您的流媒体资源。