当前位置:首页 > 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 命令进行身份验证。

php socket 实现ftp

$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 和端口建立数据连接。

php socket 实现ftp

$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");
}

关闭连接

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

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 (…

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaS…

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE…

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTMP协…

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE T…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…