FTP 函数通过文件传输协议 (FTP) 提供对文件服务器的客户端访问。
FTP 函数用于打开、登录以及关闭连接,同时用于上传、下载、重命名、删除及获取文件服务器上的文件信息。不是所有的 FTP 函数对每个服务器都起作用或返回相同的结果。自 PHP 3 起,FTP 函数可用。
这些函数用于对 FTP 服务器进行细致的访问。如果您仅仅需要对 FTP 服务器进行读写操作,建议使用 Filesystem 函数中的 ftp:// wrapper。
PHP 的 Windows 版本内置了对 FTP 扩展的支持。无需加载任何附加扩展库即可使用 FTP 函数。
然而,如果您运行的是 PHP 的 Linux 版本,在编译 PHP 的时候请添加 --enable-ftp 选项(PHP4 或以上版本)或者 --with-ftp 选项(PHP3 版本)。
// 检查FTP扩展是否已启用
if (extension_loaded('ftp')) {
echo 'FTP 扩展已启用';
} else {
echo 'FTP 扩展未启用';
}
// 获取FTP函数列表
$ftp_functions = get_extension_funcs('ftp');
echo "可用的FTP函数:\n";
print_r($ftp_functions);
| 函数 | 描述 | 版本 |
|---|---|---|
| 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+ |
| 常量 | 描述 | 版本 |
|---|---|---|
| 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_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);
// 使用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_connect() 进行安全连接