当前位置:首页 > PHP

php socket 实现ftp

2026-02-16 20:18:50PHP

PHP Socket 实现 FTP

使用 PHP Socket 实现 FTP 功能需要手动处理 FTP 协议的通信细节,包括建立控制连接和数据连接。以下是实现 FTP 的基本步骤和代码示例。

建立控制连接

FTP 控制连接默认使用端口 21,通过 Socket 连接到 FTP 服务器并发送命令。

$host = 'ftp.example.com';
$port = 21;
$timeout = 30;

$controlSocket = fsockopen($host, $port, $errno, $errstr, $timeout);
if (!$controlSocket) {
    die("无法连接到 FTP 服务器: $errstr ($errno)");
}

// 读取欢迎消息
while ($line = fgets($controlSocket, 1024)) {
    if (substr($line, 3, 1) == ' ') {
        break;
    }
}

登录 FTP 服务器

发送 USERPASS 命令进行身份验证。

$username = 'your_username';
$password = 'your_password';

fputs($controlSocket, "USER $username\r\n");
$response = fgets($controlSocket, 1024);
if (strpos($response, '331') === false) {
    die("用户名错误: $response");
}

fputs($controlSocket, "PASS $password\r\n");
$response = fgets($controlSocket, 1024);
if (strpos($response, '230') === false) {
    die("密码错误: $response");
}

设置被动模式

FTP 被动模式(PASV)用于建立数据连接,服务器会返回一个 IP 和端口用于数据传输。

fputs($controlSocket, "PASV\r\n");
$response = fgets($controlSocket, 1024);
if (strpos($response, '227') === false) {
    die("无法进入被动模式: $response");
}

// 解析 PASV 响应获取数据连接信息
preg_match('/\((\d+),(\d+),(\d+),(\d+),(\d+),(\d+)\)/', $response, $matches);
$dataHost = "$matches[1].$matches[2].$matches[3].$matches[4]";
$dataPort = $matches[5] * 256 + $matches[6];

建立数据连接

使用解析出的 IP 和端口建立数据连接。

$dataSocket = fsockopen($dataHost, $dataPort, $errno, $errstr, $timeout);
if (!$dataSocket) {
    die("无法建立数据连接: $errstr ($errno)");
}

下载文件

发送 RETR 命令下载文件,数据通过数据连接传输。

$remoteFile = '/path/to/remote/file.txt';
$localFile = 'file.txt';

fputs($controlSocket, "RETR $remoteFile\r\n");
$response = fgets($controlSocket, 1024);
if (strpos($response, '150') === false) {
    die("下载失败: $response");
}

$fileHandle = fopen($localFile, 'w');
while (!feof($dataSocket)) {
    fwrite($fileHandle, fread($dataSocket, 8192));
}
fclose($fileHandle);
fclose($dataSocket);

// 检查传输完成
$response = fgets($controlSocket, 1024);
if (strpos($response, '226') === false) {
    die("传输未完成: $response");
}

上传文件

发送 STOR 命令上传文件,数据通过数据连接传输。

$remoteFile = '/path/to/remote/file.txt';
$localFile = 'file.txt';

fputs($controlSocket, "STOR $remoteFile\r\n");
$response = fgets($controlSocket, 1024);
if (strpos($response, '150') === false) {
    die("上传失败: $response");
}

$fileHandle = fopen($localFile, 'r');
while (!feof($fileHandle)) {
    fwrite($dataSocket, fread($fileHandle, 8192));
}
fclose($fileHandle);
fclose($dataSocket);

// 检查传输完成
$response = fgets($controlSocket, 1024);
if (strpos($response, '226') === false) {
    die("传输未完成: $response");
}

关闭连接

完成操作后关闭控制连接。

php socket 实现ftp

fputs($controlSocket, "QUIT\r\n");
fclose($controlSocket);

注意事项

  • FTP 协议需要处理 ASCII 和二进制模式,使用 TYPE ATYPE I 命令切换。
  • 错误处理需检查 FTP 响应码,如 4xx5xx 表示错误。
  • 被动模式可能因防火墙或 NAT 导致问题,需确保网络配置正确。

通过以上步骤,可以实现基本的 FTP 文件传输功能。如需更复杂的功能(如目录操作、文件列表等),需进一步扩展命令处理逻辑。

标签: phpsocket
分享给朋友:

相关文章

php实现定时任务

php实现定时任务

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

php 实现文件下载

php 实现文件下载

实现文件下载的基本方法 使用 PHP 实现文件下载的核心是通过设置 HTTP 头部信息,强制浏览器将文件作为附件下载而非直接显示。以下是一个基础实现示例: $file_path = '/path/t…

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…

php mvc 实现

php mvc 实现

PHP MVC 实现方法 MVC(Model-View-Controller)是一种设计模式,用于分离应用程序的逻辑、数据和界面。以下是实现PHP MVC框架的关键步骤。 目录结构 创建以下目录结构…

php实现注册登录

php实现注册登录

PHP 注册功能实现 创建数据库表(以 MySQL 为例) CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, usern…

php登陆功能实现

php登陆功能实现

实现PHP登录功能 数据库准备 创建一个用户表存储登录信息,基本字段包括用户名、密码(需加密)等: CREATE TABLE users ( id INT AUTO_INCREMENT PR…