PHP FTP 函数

FTP 函数通过文件传输协议 (FTP) 提供对文件服务器的客户端访问,支持安全连接和非阻塞操作。

PHP FTP 简介

FTP 函数通过文件传输协议 (FTP) 提供对文件服务器的客户端访问。

FTP 函数用于打开、登录以及关闭连接,同时用于上传、下载、重命名、删除及获取文件服务器上的文件信息。不是所有的 FTP 函数对每个服务器都起作用或返回相同的结果。自 PHP 3 起,FTP 函数可用。

这些函数用于对 FTP 服务器进行细致的访问。如果您仅仅需要对 FTP 服务器进行读写操作,建议使用 Filesystem 函数中的 ftp:// wrapper。

FTP 协议简介
  • FTP(File Transfer Protocol)是用于在网络上进行文件传输的标准协议
  • 支持主动模式(Active)和被动模式(Passive)
  • FTP-SSL 提供安全的加密连接
  • 支持ASCII和二进制传输模式

安装说明

PHP 的 Windows 版本内置了对 FTP 扩展的支持。无需加载任何附加扩展库即可使用 FTP 函数。

然而,如果您运行的是 PHP 的 Linux 版本,在编译 PHP 的时候请添加 --enable-ftp 选项(PHP4 或以上版本)或者 --with-ftp 选项(PHP3 版本)。

检查FTP扩展是否可用
// 检查FTP扩展是否已启用
if (extension_loaded('ftp')) {
    echo 'FTP 扩展已启用';
} else {
    echo 'FTP 扩展未启用';
}

// 获取FTP函数列表
$ftp_functions = get_extension_funcs('ftp');
echo "可用的FTP函数:\n";
print_r($ftp_functions);

PHP FTP 函数列表

共收录 30+ 个FTP函数
函数 描述 版本
ftp_alloc() 为要上传到 FTP 服务器的文件分配空间。 PHP 5+
ftp_cdup() 把当前目录改变为 FTP 服务器上的父目录。 PHP 3+
ftp_chdir() 改变 FTP 服务器上的当前目录。 PHP 3+
ftp_chmod() 通过 FTP 设置文件上的权限。 PHP 5+
ftp_close() 关闭 FTP 连接。 PHP 4+
ftp_connect() 打开 FTP 连接。 PHP 3+
ftp_delete() 删除 FTP 服务器上的一个文件。 PHP 3+
ftp_exec() 在 FTP 服务器上执行一个程序/命令。 PHP 4+
ftp_fget() 从 FTP 服务器上下载一个文件并保存到本地一个已经打开的文件中。 PHP 3+
ftp_fput() 上传一个已经打开的文件,并在 FTP 服务器上把它保存为一个文件。 PHP 3+
ftp_get_option() 返回 FTP 连接的各种运行时选项。 PHP 4+
ftp_get() 从 FTP 服务器上下载文件。 PHP 3+
ftp_login() 登录 FTP 服务器。 PHP 3+
ftp_mdtm() 返回指定文件的最后修改时间。 PHP 3+
ftp_mkdir() 在 FTP 服务器上创建一个新目录。 PHP 3+
ftp_nb_continue() 连续获取/发送文件。(无阻塞) PHP 4+
ftp_nb_fget() 从 FTP 服务器上下载一个文件并保存到本地一个已经打开的文件中。(无阻塞) PHP 4+
ftp_nb_fput() 上传一个已经打开的文件,并在 FTP 服务器上把它保存为一个文件。(无阻塞) PHP 4+
ftp_nb_get() 从 FTP 服务器上下载文件。(无阻塞) PHP 4+
ftp_nb_put() 把文件上传到 FTP 服务器上。(无阻塞) PHP 4+
ftp_nlist() 返回 FTP 服务器上指定目录的文件列表。 PHP 3+
ftp_pasv() 把被动模式设置为打开或关闭。 PHP 3+
ftp_put() 把文件上传到 FTP 服务器上。 PHP 3+
ftp_pwd() 返回当前目录名称。 PHP 3+
ftp_quit() ftp_close() 的别名。 PHP 3+
ftp_raw() 向 FTP 服务器发送一个 raw 命令。 PHP 5+
ftp_rawlist() 返回指定目录中文件的详细列表。 PHP 3+
ftp_rename() 重命名 FTP 服务器上的文件或目录。 PHP 3+
ftp_rmdir() 删除 FTP 服务器上的一个目录。 PHP 3+
ftp_set_option() 设置 FTP 连接的各种运行时选项。 PHP 4+
ftp_site() 向服务器发送 SITE 命令。 PHP 3+
ftp_size() 返回指定文件的大小。 PHP 3+
ftp_ssl_connect() 打开一个安全的 SSL-FTP 连接。 PHP 4+
ftp_systype() 返回 FTP 服务器的系统类型标识符。 PHP 3+
ftp_append() 向FTP服务器上的文件追加内容。 PHP 7.2+

PHP FTP 常量

常量 描述 版本
FTP_ASCII ASCII传输模式(用于文本文件)。 PHP 3+
FTP_TEXT FTP_ASCII 的别名。 PHP 3+
FTP_BINARY 二进制传输模式(用于图像、压缩文件等)。 PHP 3+
FTP_IMAGE FTP_BINARY 的别名。 PHP 3+
FTP_TIMEOUT_SEC 设置FTP操作超时时间(秒)。 PHP 3+
FTP_AUTOSEEK 自动定位选项。 PHP 4+
FTP_AUTORESUME 为 GET 和 PUT 请求自动决定恢复和开始的位置。 PHP 4+
FTP_FAILED 异步传输失败。 PHP 4+
FTP_FINISHED 异步传输成功。 PHP 4+
FTP_MOREDATA 异步传输是活动状态的。 PHP 4+

使用示例

基本FTP连接和操作
// 连接到FTP服务器
$ftp_server = 'ftp.example.com';
$ftp_user = 'username';
$ftp_pass = 'password';

// 建立连接
$conn_id = ftp_connect($ftp_server) or die("无法连接到 $ftp_server");

// 登录
if (@ftp_login($conn_id, $ftp_user, $ftp_pass)) {
    echo "成功连接到 $ftp_server\n";
} else {
    echo "无法登录到 $ftp_server\n";
}

// 开启被动模式(推荐用于防火墙后)
ftp_pasv($conn_id, true);

// 获取当前目录
echo "当前目录: " . ftp_pwd($conn_id) . "\n";

// 列出目录内容
$files = ftp_nlist($conn_id, ".");
echo "目录内容:\n";
foreach ($files as $file) {
    echo " - $file\n";
}

// 关闭连接
ftp_close($conn_id);
文件上传和下载
// 连接到FTP服务器
$conn_id = ftp_connect('ftp.example.com');
ftp_login($conn_id, 'username', 'password');
ftp_pasv($conn_id, true);

// 上传文件(二进制模式)
$local_file = 'local_file.zip';
$remote_file = 'remote_file.zip';

if (ftp_put($conn_id, $remote_file, $local_file, FTP_BINARY)) {
    echo "文件上传成功\n";
} else {
    echo "文件上传失败\n";
}

// 下载文件
$local_file = 'downloaded_file.zip';
$remote_file = 'remote_file.zip';

if (ftp_get($conn_id, $local_file, $remote_file, FTP_BINARY)) {
    echo "文件下载成功\n";
} else {
    echo "文件下载失败\n";
}

// 获取文件信息
$file_size = ftp_size($conn_id, $remote_file);
$file_time = ftp_mdtm($conn_id, $remote_file);

echo "文件大小: $file_size 字节\n";
if ($file_time != -1) {
    echo "最后修改时间: " . date("Y-m-d H:i:s", $file_time) . "\n";
} else {
    echo "无法获取修改时间\n";
}

// 关闭连接
ftp_close($conn_id);
非阻塞传输(大文件处理)
// 连接到FTP服务器
$conn_id = ftp_connect('ftp.example.com');
ftp_login($conn_id, 'username', 'password');

// 非阻塞方式下载大文件
$local_file = 'large_file.iso';
$remote_file = 'large_file.iso';

// 开始非阻塞下载
$result = ftp_nb_get($conn_id, $local_file, $remote_file, FTP_BINARY);

while ($result == FTP_MOREDATA) {
    // 可以在这里做其他事情
    echo "下载中...\n";
    $result = ftp_nb_continue($conn_id);
}

if ($result == FTP_FINISHED) {
    echo "文件下载完成\n";
} elseif ($result == FTP_FAILED) {
    echo "文件下载失败\n";
}

// 非阻塞上传
$local_file = 'large_upload.iso';
$remote_file = 'large_upload.iso';

$result = ftp_nb_put($conn_id, $remote_file, $local_file, FTP_BINARY);

while ($result == FTP_MOREDATA) {
    echo "上传中...\n";
    // 可以在这里显示进度或做其他事情
    $result = ftp_nb_continue($conn_id);
}

if ($result == FTP_FINISHED) {
    echo "文件上传完成\n";
}

// 关闭连接
ftp_close($conn_id);
高级FTP操作
// 使用SSL安全连接
$conn_id = ftp_ssl_connect('ftp.example.com', 21);
if (!$conn_id) {
    die('无法建立SSL连接');
}

ftp_login($conn_id, 'username', 'password');

// 设置连接选项
ftp_set_option($conn_id, FTP_TIMEOUT_SEC, 300); // 设置超时为5分钟
ftp_set_option($conn_id, FTP_AUTOSEEK, true);   // 启用自动定位

// 获取连接选项
$timeout = ftp_get_option($conn_id, FTP_TIMEOUT_SEC);
echo "连接超时设置: $timeout 秒\n";

// 创建目录
if (ftp_mkdir($conn_id, 'new_directory')) {
    echo "目录创建成功\n";
}

// 改变目录
ftp_chdir($conn_id, 'new_directory');

// 设置文件权限(仅限Unix/Linux服务器)
if (ftp_chmod($conn_id, 0644, 'file.txt')) {
    echo "文件权限设置成功\n";
}

// 重命名文件
if (ftp_rename($conn_id, 'old_name.txt', 'new_name.txt')) {
    echo "文件重命名成功\n";
}

// 删除文件
if (ftp_delete($conn_id, 'file_to_delete.txt')) {
    echo "文件删除成功\n";
}

// 删除目录(必须为空)
if (ftp_rmdir($conn_id, 'empty_directory')) {
    echo "目录删除成功\n";
}

// 获取详细文件列表
$file_list = ftp_rawlist($conn_id, '.');
echo "详细文件列表:\n";
foreach ($file_list as $file_info) {
    echo $file_info . "\n";
}

// 执行服务器命令(如果服务器支持)
ftp_site($conn_id, 'CHMOD 755 file.txt');

// 关闭连接
ftp_close($conn_id);
最佳实践
  • 使用 ftp_ssl_connect() 进行安全连接
  • 开启被动模式(ftp_pasv($conn, true))以避免防火墙问题
  • 对文本文件使用 FTP_ASCII 模式,对二进制文件使用 FTP_BINARY 模式
  • 处理大文件时使用非阻塞函数(ftp_nb_*
  • 始终检查函数返回值以确保操作成功
  • 设置适当的超时时间
  • 及时关闭FTP连接
  • 考虑使用连接池提高性能
安全注意事项
  • 使用SSL/TLS:始终使用 ftp_ssl_connect() 进行安全连接
  • 密码安全:不要在代码中硬编码密码,使用配置文件或环境变量
  • 文件验证:验证上传和下载的文件类型和大小
  • 权限限制:使用最小必要权限的FTP账户
  • 错误处理:不要向用户显示详细的错误信息
  • 连接超时:设置合理的超时时间以防止连接挂起