我有以下用于将网络文件直接下载到我的网络服务器的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,我的服务器也能正常工作。
答案 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
用于您的流媒体资源。