php 实现ftp
使用 PHP 内置 FTP 函数实现 FTP 操作
PHP 提供了一系列内置函数用于 FTP 操作,需确保服务器已启用 FTP 扩展(php_ftp.dll 或 php_ftp.so)。
连接 FTP 服务器并登录:
$ftpServer = "ftp.example.com";
$ftpUser = "username";
$ftpPass = "password";
$conn = ftp_connect($ftpServer) or die("无法连接服务器");
ftp_login($conn, $ftpUser, $ftpPass);
上传文件到 FTP 服务器:
$localFile = "local.txt";
$remoteFile = "remote.txt";
if (ftp_put($conn, $remoteFile, $localFile, FTP_BINARY)) {
echo "文件上传成功";
} else {
echo "文件上传失败";
}
从 FTP 服务器下载文件:
if (ftp_get($conn, $localFile, $remoteFile, FTP_BINARY)) {
echo "文件下载成功";
} else {
echo "文件下载失败";
}
列出 FTP 目录内容:

$files = ftp_nlist($conn, ".");
print_r($files);
关闭 FTP 连接:
ftp_close($conn);
使用第三方库(如 phpseclib)实现更安全的 SFTP
对于需要加密传输的场景,推荐使用 phpseclib 库实现 SFTP 功能。
安装 phpseclib:

composer require phpseclib/phpseclib
SFTP 连接与文件操作示例:
use phpseclib3\Net\SFTP;
$sftp = new SFTP('sftp.example.com');
if (!$sftp->login('username', 'password')) {
exit('登录失败');
}
// 上传文件
$sftp->put('remote.txt', 'local.txt');
// 下载文件
$data = $sftp->get('remote.txt', 'local_download.txt');
// 列出目录
$files = $sftp->nlist();
print_r($files);
错误处理与调试
建议在所有 FTP 操作中添加错误处理逻辑:
ftp_pasv($conn, true); // 启用被动模式
if (!ftp_set_option($conn, FTP_TIMEOUT_SEC, 30)) {
echo "设置超时失败";
}
// 检查文件是否存在
if (ftp_size($conn, $remoteFile) != -1) {
echo "文件存在";
}
注意事项
确保服务器防火墙允许 FTP 连接(默认端口 21),SFTP 使用 22 端口。被动模式可能需要额外配置服务器防火墙开放端口范围。
对于大文件传输,建议使用二进制模式(FTP_BINARY)并显示传输进度:
function ftpProgress($callback) {
return function($ch, $downloadSize, $downloaded, $uploadSize, $uploaded) use ($callback) {
$callback($uploaded, $uploadSize);
};
}
ftp_set_option($conn, FTP_PROGRESS_CALLBACK, ftpProgress(function($uploaded, $uploadSize) {
if ($uploadSize > 0) {
echo round(($uploaded / $uploadSize) * 100) . "%\n";
}
}));






