当前位置:首页 > PHP

php实现ftp下载

2026-02-15 16:16:25PHP

使用PHP内置FTP函数实现下载

PHP提供了一系列内置FTP函数,无需额外安装扩展即可实现基本FTP操作。以下是通过ftp_get()函数实现文件下载的典型流程:

$ftp_server = "ftp.example.com";
$ftp_user = "username";
$ftp_pass = "password";
$remote_file = "/path/to/remote/file.txt";
$local_file = "localfile.txt";

$conn = ftp_connect($ftp_server) or die("Could not connect to $ftp_server");

if (ftp_login($conn, $ftp_user, $ftp_pass)) {
    ftp_pasv($conn, true); // 启用被动模式
    if (ftp_get($conn, $local_file, $remote_file, FTP_BINARY)) {
        echo "File downloaded successfully";
    } else {
        echo "Error downloading file";
    }
}

ftp_close($conn);

使用cURL库实现FTP下载

对于需要更复杂控制的场景,cURL提供了更灵活的FTP操作方式:

$remote_url = "ftp://username:password@ftp.example.com/path/to/file.txt";
$local_path = "downloaded_file.txt";

$fp = fopen($local_path, 'w');

$ch = curl_init($remote_url);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FTP_USE_EPSV, true); // 使用EPSV模式
curl_setopt($ch, CURLOPT_TIMEOUT, 300); // 超时设置

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

if ($result) {
    echo "File downloaded via cURL";
}

处理大文件下载

对于大文件下载,建议采用流式处理并显示进度:

$ftp = ftp_connect("ftp.example.com");
ftp_login($ftp, "user", "pass");
ftp_pasv($ftp, true);

$remote_size = ftp_size($ftp, "largefile.zip");
$handle = fopen("local_copy.zip", "w");

$start_time = time();
$last_print = 0;

ftp_nb_get($ftp, "local_copy.zip", "largefile.zip", FTP_BINARY, function($downloaded) use ($remote_size, $start_time, &$last_print) {
    if (time() - $last_print > 1) { // 每秒更新一次进度
        $percent = round(($downloaded/$remote_size)*100, 2);
        $elapsed = time() - $start_time;
        $speed = $elapsed > 0 ? round($downloaded/1024/$elapsed, 2) : 0;
        echo "Downloaded: $percent% ($speed KB/s)\n";
        $last_print = time();
    }
});

ftp_close($ftp);
fclose($handle);

安全注意事项

FTP协议默认不加密传输,敏感数据应考虑使用FTPS(FTP over SSL)或SFTP(SSH File Transfer Protocol)。PHP的ftp_ssl_connect()函数支持FTPS:

$conn = ftp_ssl_connect("ftp.example.com");
if ($conn && ftp_login($conn, "user", "pass")) {
    ftp_get($conn, "local.txt", "remote.txt", FTP_BINARY);
    ftp_close($conn);
}

错误处理与重试机制

稳健的实现应包含错误处理和自动重试:

function ftpDownloadWithRetry($host, $user, $pass, $remote, $local, $retries = 3) {
    for ($i = 0; $i < $retries; $i++) {
        try {
            $ftp = ftp_connect($host);
            if (!ftp_login($ftp, $user, $pass)) throw new Exception("Login failed");

            ftp_pasv($ftp, true);
            if (ftp_get($ftp, $local, $remote, FTP_BINARY)) {
                ftp_close($ftp);
                return true;
            }
        } catch (Exception $e) {
            if (isset($ftp)) ftp_close($ftp);
            if ($i == $retries - 1) throw $e;
            sleep(pow(2, $i)); // 指数退避
        }
    }
    return false;
}

php实现ftp下载

标签: phpftp
分享给朋友:

相关文章

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class Tr…

php实现定时任务

php实现定时任务

PHP 实现定时任务的几种方法 在 PHP 中实现定时任务可以通过多种方式完成,具体选择取决于项目需求和服务器环境。以下是常见的实现方法: 使用 Cron 任务 Cron 是 Linux 系统中常用…

php实现注册

php实现注册

注册功能实现步骤 数据库准备 创建用户表,包含字段如id、username、password、email等。示例SQL: CREATE TABLE users ( id INT AUTO_…

php 实现接口

php 实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体的实现。类可以实现(implement)接口,并必须实现接口中定义的所有方法。 定义接口 接口通…

php 函数实现

php 函数实现

PHP 函数实现基础 PHP 函数的定义使用 function 关键字,后跟函数名和参数列表。函数名不区分大小写,但建议保持一致。 function functionName($param1, $p…

php 实现类

php 实现类

PHP 类的基本实现 在 PHP 中,类通过 class 关键字定义,后跟类名和一对花括号。类名通常遵循大驼峰命名法(如 ClassName)。以下是基本语法: class ClassName {…