php-下载速度比readfile慢很多

我正在通过PHP脚本从URL向我的用户提供下载.使用readfile()时,我的连接可以获得支持的最大下载速度(大约2.5MB / s),但是当我使用fopen,fread,fclose路由时,下载速度非常非常慢(大约1-2KB / s).

这是我的代码:

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . $filesize);
ob_clean();
flush();

$file = fopen($url, 'rb');

while(!feof($file)) {
    echo fread($file, 2014);
}

而readfile代码就是readfile($link);.

由于两个原因,我不能只使用readfile()函数,一个是我想限制用户的下载速度(我可以通过仅读取这么多数据来进行读取),并且我还想跟踪用户的数量正在下载(我可以使用readfile()进行此操作,但不算部分下载).

有谁知道为什么会发生这种情况或如何解决?据我所知,readfile()只是fopen,fread和fclose的包装器,因此我不会出什么问题.

编辑:最终为此使用了cURL.

$curl = curl_init();
$options = array(
    CURLOPT_URL => $rdLink,
    CURLOPT_FAILONERROR => true,
    CURLOPT_BINARYTRANSFER => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_WRITEFUNCTION => 'readResponse'
);
curl_setopt_array($curl, $options);

if(!curl_exec($curl)) {
    header('Location: http://whatever.com');
    exit;
}
curl_close($curl);

function readResponse($ch, $data) {
    $length = mb_strlen($data, '8bit');

    echo $data;

    return $length;
}

解决方法:

使用stream_context_create()stream_get_contents()

$context = stream_context_create();
$file = fopen($url, 'rb', FALSE, $context);
while(!feof($file))
{
    //usleep(1000000);
    echo stream_get_contents($file, 2014);
}

您也可以尝试使文件读取长度变长,然后放入usleep()以减慢执行速度.
无论如何,似乎建议不要将流功能推荐为最新版本的PHP.
您可能还希望在fread()或stream_get_contents()前面加一个@,以抑制任何错误,至少在生产中.没有它,还有一点不幸,您的文件已损坏.

上一篇:读取文本文件并检查列数对于所有行都是相同的


下一篇:[bzoj 1026]windy数(数位DP)