PHP FTP文件同步类:实现主从服务器自动上传与目录创建
在服务器架构中,主从节点间的文件同步通常依赖可靠的传输协议。通过构建专门的PHP FTP类,可以将连接验证、递归目录创建及文件传输流程标准化,从而简化开发并提升主从同步的稳定性。
应用场景与准备
该解决方案适用于需要将本地资源推送到远端服务器(或备份节点)的场景。在执行操作前,请确保:
- 目标FTP服务器的IP地址、端口(默认21)、账号及密码正确。
- PHP环境已启用
ftp扩展。
3. - 主节点拥有足够的权限访问指定目录。
核心类设计与参数
该类通过私有属性维护测试服配置,并通过统一的接口对外提供服务。主要参数包括:
- $testServer:包含
host,port,user,pwd的连接参数。 - $flag:用于区分不同环境(如测试服、生产服)的标识符。
关键步骤说明
第1步:建立与登录FTP服务
目的:获取有效的会话句柄。
操作逻辑:
- 调用
openServer($flag)。 - 使用
ftp_connect()进行TCP握手。 - 使用
ftp_login()完成身份认证。 - 关键配置:开启被动模式
ftp_pasv($connect, true),解决部分网络环境下客户端无法启动数据传输的问题。
第2步:处理远程目录结构
目的:确保目标路径存在,避免因目录缺失导致上传失败。
操作逻辑:
通过 makeDir($connect, $dirPath) 实现。
- 接收完整路径,并按
/分隔。 - 遍历每一个层级,判断是否存在(
ftp_chdir)。 - 若不存在,则依次创建(
ftp_mkdir)并跳转。
第3步:执行文件传输
目的:将数据准确写入远程。
操作逻辑:
调用 upload($flag, $local, $remote)。
- 首先解析出远程文件的父目录并创建。
- 使用
ftp_put()上传,建议设置传输模式为FTP_BINARY以确保图片等二进制数据的完整性。 - 无论成功与否均断开连接释放资源。
完整代码参考
<?php
/**
* ftp上传文件类
*/
class Ftp {
/**
* 测试服务器配置
*
* @var array
*/
private $testServer = array(
'host' => 'ip',
'port' => 21,
'user' => 'userName',
'pwd' => 'password'
);
/**
* 打开并登录服务器
*
* @param string $flag 服务器标识test
* @return mixed
* 0:服务器连接失败
* 1:服务器登录失败
* resource 连接标识
*/
public function openServer($flag = 'test'){
//选择服务器配置
$config = $this->getServerConfig($flag);
//连接服务器
$connect = ftp_connect($config['host'], $config['port']);
if($connect == false) return 0;
//登录服务器
if(!ftp_login($connect, $config['user'], $config['pwd'])) return 1;
//开启被动模式
ftp_pasv($connect, true);
//返回连接标识
return $connect;
}
/**
* 创建目录并将目录定位到当前目录
*
* @param resource $connect 连接标识
* @param string $dirPath 目录路径
* @return mixed
* 2:创建目录失败
* true:创建目录成功
*/
public function makeDir($connect, $dirPath){
//处理目录格式
$dirPath = '/' . trim($dirPath, '/');
$dirPathArr = explode('/', $dirPath);
foreach ($dirPathArr as $dir){
if($dir == '') $dir = '/';
//判断目录是否存在
if(@ftp_chdir($connect, $dir) == false){
//尝试创建目录
if(@ftp_mkdir($connect, $dir) == false){
return 2;
}
@ftp_chdir($connect, $dir);
}
}
return true;
}
/**
* 关闭服务器连接
*
* @param resource $connect 连接标识
*/
public function closeServer($connect){
if(!empty($connect)) ftp_close($connect);
}
/**
* 上传文件
*
* @param string $flag 服务器标识
* @param string $local 上传文件的本地路径
* @param string $remote 上传文件的远程路径
* @return int
* 0:服务器连接失败
* 1:服务器登录失败
* 2:创建目录失败
* 3:上传文件失败
* 4:上传成功
*/
public function upload($flag = 'test', $local, $remote){
//连接并登录服务器
$connect = $this->openServer($flag);
if(($connect === 0) || ($connect === 1)) return $connect;
//上传文件目录处理
$mdr = $this->makeDir($connect, dirname($remote));
if($mdr === 2) return 2;
//执行文件上传 (FTP_BINARY 确保数据块一致)
$result = ftp_put($connect, basename($remote), $local, FTP_BINARY);
//关闭连接
$this->closeServer($connect);
//返回结果
return (!$result) ? 3 : 4;
}
/**
* 获取ftp服务器配置
*
* @param string $flag 服务器标识test
* @return array ftp服务器连接配置
*/
private function getServerConfig($flag = 'test'){
$flag = strtolower($flag);
//目前仅支持测试服务器配置,可按需扩展
return $this->testServer;
}
}
?>
总结
通过上述封装,可以自动化处理FTP通信中的繁琐细节,特别是针对远程路径逐级创建和被动模式的配置。以上就是PHP使用FTP远程上传文件类的详细内容,更多关于PHP FTP编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









