当前位置:首页 > 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 实现文件下载的方法 使用 header() 函数强制下载 设置正确的 HTTP 头信息,强制浏览器下载文件而不是直接打开。 $file = 'path/to/file.pdf'; if (f…

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…

php实现定时

php实现定时

PHP 实现定时任务的方法 PHP 本身是脚本语言,通常需要借助外部工具或框架实现定时任务。以下是几种常见方法: 使用 Cron 任务 Linux 系统自带的 Cron 是常用的定时任务工具。通过编…

php数组实现

php数组实现

PHP 数组的基本实现 PHP 数组是一种非常灵活的数据结构,可以存储多个值,并且支持多种类型的键(整数或字符串)。PHP 数组实际上是有序映射(ordered map),可以看作是列表(vector…

php实现推送消息推送消息

php实现推送消息推送消息

PHP 实现消息推送的方法 使用 WebSocket 实现实时推送 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适合实现实时消息推送。 安装 Ratchet 库(WebSo…