使用curl时某些文件未完全下载

时间:2019-11-10 13:07:23

标签: php curl

我需要使用curl将备份文件从一个Web服务器下载到另一个Web服务器。但是我有一些限制:

  1. 我没有对任何服务器的shell和/或ftp访问。
  2. 即使域未指向源服务器,此解决方案也应能工作

以下是我所谈论的例子:

让我们假设example.com存在于IP地址为1.1.1.1的服务器上,而域本身指向的是其他IP地址(例如2.2.2.2)。

我知道example.com文件夹中的1.1.1.1服务器上有一些存档文件

我创建了一些测试代码,这些代码似乎适用于数百KB的文件,但不适用于600 MB的文件,我无法检测到问题。

在这种情况下,curl是否将文件下载到RAM或像复制功能那样读取大块数据?如果它首先将数据下载到RAM中,是否有一些解决方案可以执行此wget的确切操作:“ wget --header ='Host:example.com'http://1.1.1.1/a.tar”?

function get_file( $domain, $path_to_remote_file, $ip, $f_out )
{
    $url = "http://" . $domain . "/" . $path_to_remote_file;
    $handle = fopen($f_out, "w");
    $ch = curl_init( $url );

    curl_setopt( $ch, 
           CURLOPT_RESOLVE, 
           array (
                    $domain . ":80:" . $ip,
                    "www." . $domain . ":80:" . $ip
        ) 
    );

    curl_setopt( $ch, CURLOPT_DNS_USE_GLOBAL_CACHE, false );
    curl_setopt( $ch, CURLOPT_FILE, $handle );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
    curl_setopt( $ch, CURLOPT_TIMEOUT, 300);

    $result = curl_exec( $ch );
    curl_close( $ch );
    fclose( $handle );

    echo $result;
}

1 个答案:

答案 0 :(得分:0)

您的问题不在于curl,wget,dns或文件大小。也许是您编写PHP脚本的时间。

您可以尝试启用PHP LOG,并检查脚本为何停止。然后,您可以尝试使用set_time_limit(0)。请注意,您是否正在使用共享主机,也许管理员会警告您有关时间。

一个很好的解决方案:使用工作者或cron作业。例如,plesk和cpanel具有使用php-cli运行PHP的模式,而没有任何http请求。