使用php curl逐块下载大文件

使用php curl逐块下载大文件,php,curl,Php,Curl,我需要php脚本的可恢复文件下载从url到服务器。它应该能够开始下载,然后在快照时(30秒-5分钟)恢复,依此类推,直到完成整个文件 perl中也有类似的东西,但我想用php来做,我不懂perl 我认为使用CURLOPT_RANGE下载块,使用fopen($fileName,“a”)将其附加到服务器上的文件中 以下是我的尝试: <?php function run() { while(1) { get_chunk($_SESSION['url'], $_

我需要php脚本的可恢复文件下载从url到服务器。它应该能够开始下载,然后在快照时(30秒-5分钟)恢复,依此类推,直到完成整个文件

perl中也有类似的东西,但我想用php来做,我不懂perl

我认为使用
CURLOPT_RANGE
下载块,使用
fopen($fileName,“a”)
将其附加到服务器上的文件中

以下是我的尝试:

<?php

function run()
{
    while(1)
    {
         get_chunk($_SESSION['url'], $_SESSION['filename']);
         sleep(5);
         flush();
    }    
}

function get_chunk( $url, $fileName)
{

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    if (file_exists($fileName)) {
        $from = filesize($fileName);
        curl_setopt($ch, CURLOPT_RANGE, $from . "-");//maybe "-".$from+1000 for 1MB chunks
    }

    $fp = fopen($fileName, "a");
    if (!$fp) {
        exit;
    }
    curl_setopt($ch, CURLOPT_FILE, $fp);
    $result = curl_exec($ch);
    curl_close($ch);

    fclose($fp);

}

?>

如果您的目的是通过脆弱的连接下载文件,
curl
有一个
--retry
标志,在出现错误时自动重试下载,并在停止位置继续。不幸的是,这似乎是因为

通常,我建议使用库而不是外部命令,但在这种情况下,只调用命令行上的
curl--retry
curl-C-
可能比使用自己的命令更简单
wget-c
是另一个选项

否则,我看不到总是以块的形式获取数据的必要性。尽可能多地下载,如果出现错误,请使用CURLOPT_范围和文件大小恢复您现在的状态。

这将非常有用。