PHP ftp_site() 函数

ftp_site() 函数用于向 FTP 服务器发送 SITE 命令。

SITE 命令允许执行特定于 FTP 服务器的操作,这些操作通常不是标准 FTP 协议的一部分。不同的 FTP 服务器支持不同的 SITE 命令,具体取决于服务器的配置和实现。

注意:SITE 命令是服务器特定的,不是所有 FTP 服务器都支持相同的 SITE 命令。使用前请查阅服务器的文档。

语法

ftp_site ( resource $ftp_stream , string $command ) : bool

参数

参数 类型 描述
$ftp_stream resource 必需的。FTP 连接的标识符,由 ftp_connect()ftp_ssl_connect() 返回。
$command string 必需的。要发送到 FTP 服务器的 SITE 命令字符串。

返回值

如果命令成功发送,返回 true;如果失败,返回 false

注意:返回 true 只表示命令已成功发送到服务器,不表示命令本身执行成功。某些服务器可能会返回错误响应,但函数仍可能返回 true

常见的 SITE 命令

以下是一些常见的 SITE 命令示例,但实际支持的命令取决于 FTP 服务器软件:

命令 描述
SITE CHMOD 644 filename 更改文件权限(在 Unix/Linux 服务器上常见)
SITE HELP 列出服务器支持的 SITE 命令
SITE UMASK 022 设置文件创建时的默认权限掩码
SITE ZIP ON/OFF 启用或禁用压缩传输
SITE IDLE 3600 设置空闲超时时间(秒)
SITE ALIAS name path 创建目录别名
SITE WHO 显示当前连接的用户
SITE STAT 显示服务器状态信息

示例

示例 1:基本使用 - 发送SITE命令

以下示例展示了如何向 FTP 服务器发送 SITE 命令。

<?php
// 连接 FTP 服务器
$ftp_server = "ftp.example.com";
$ftp_user = "username";
$ftp_pass = "password";

$conn = ftp_connect($ftp_server);
if (!$conn) {
    die("无法连接到 $ftp_server");
}

// 登录
if (!@ftp_login($conn, $ftp_user, $ftp_pass)) {
    die("登录失败");
}

// 发送 SITE HELP 命令获取支持的 SITE 命令列表
if (ftp_site($conn, "HELP")) {
    echo "SITE HELP 命令发送成功\n";
    // 注意:ftp_site() 本身不返回命令的输出
    // 要获取输出,可能需要使用 ftp_raw() 或其他方法
} else {
    echo "发送 SITE HELP 命令失败\n";
}

// 发送 SITE CHMOD 命令更改文件权限
$filename = "public_html/index.php";
if (ftp_site($conn, "CHMOD 644 $filename")) {
    echo "文件权限更改命令已发送: $filename\n";
} else {
    echo "发送 CHMOD 命令失败\n";
}

ftp_close($conn);
?>

示例 2:检查SITE命令是否支持

在实际使用前检查服务器是否支持特定的 SITE 命令。

<?php
$conn = ftp_connect("ftp.example.com");
ftp_login($conn, "username", "password");

/**
 * 检查 FTP 服务器是否支持特定的 SITE 命令
 * @param resource $conn FTP 连接
 * @param string $site_command 要检查的 SITE 命令
 * @return bool 如果服务器可能支持该命令返回 true,否则返回 false
 */
function check_site_command_support($conn, $site_command) {
    // 首先尝试获取 SITE HELP 的输出
    if (ftp_site($conn, "HELP")) {
        // 注意:ftp_site() 不返回命令输出
        // 这里只是演示逻辑,实际中可能需要使用其他方法获取输出

        // 假设我们通过某种方式获得了 HELP 的输出
        // 这里简化处理,实际应用需要更复杂的实现
        echo "服务器支持 SITE 命令,但需要查看 HELP 输出确定具体支持的命令\n";
        return true; // 假设支持
    }

    // 如果 SITE HELP 失败,尝试直接发送命令并检查错误
    if (ftp_site($conn, $site_command)) {
        echo "命令 '$site_command' 发送成功(服务器可能支持)\n";
        return true;
    } else {
        echo "命令 '$site_command' 发送失败(服务器可能不支持)\n";
        return false;
    }
}

// 检查服务器是否支持 CHMOD 命令
check_site_command_support($conn, "CHMOD");

ftp_close($conn);
?>

示例 3:使用SITE命令更改文件权限

一个更完整的示例,展示如何使用 SITE CHMOD 命令。

<?php
$ftp_server = "ftp.example.com";
$ftp_user = "username";
$ftp_pass = "password";

// 连接并登录
$conn = ftp_connect($ftp_server);
if (!$conn || !@ftp_login($conn, $ftp_user, $ftp_pass)) {
    die("FTP 连接或登录失败");
}

// 要更改权限的文件
$files = [
    "public_html/index.php",
    "public_html/style.css",
    "public_html/script.js"
];

// 为每个文件设置权限
foreach ($files as $file) {
    // 检查文件是否存在
    if (ftp_size($conn, $file) !== -1) {
        // 发送 SITE CHMOD 命令
        $command = "CHMOD 644 $file";
        if (ftp_site($conn, $command)) {
            echo "成功发送权限更改命令: $file\n";
        } else {
            echo "权限更改命令失败: $file\n";
            echo "可能原因:服务器不支持 SITE CHMOD 命令\n";
        }
    } else {
        echo "文件不存在: $file\n";
    }
}

// 设置目录权限
$directory = "public_html/uploads";
if (@ftp_chdir($conn, $directory)) {
    ftp_cdup($conn); // 返回上级目录
    if (ftp_site($conn, "CHMOD 755 $directory")) {
        echo "目录权限更改成功: $directory\n";
    }
} else {
    echo "目录不存在或无法访问: $directory\n";
}

ftp_close($conn);
?>

示例 4:获取服务器信息

使用 SITE 命令获取服务器状态和信息。

<?php
$conn = ftp_connect("ftp.example.com");
ftp_login($conn, "username", "password");

// 尝试获取服务器支持的 SITE 命令列表
echo "尝试获取服务器支持的 SITE 命令...\n";

// 发送 SITE HELP 命令
if (ftp_site($conn, "HELP")) {
    echo "SITE HELP 命令已发送\n";
    echo "注意:要查看实际输出,可能需要使用 ftp_raw() 或启用详细模式\n";
} else {
    echo "SITE HELP 命令发送失败\n";
}

// 发送 SITE STAT 命令获取服务器状态
if (ftp_site($conn, "STAT")) {
    echo "SITE STAT 命令已发送\n";
}

// 发送 SITE WHO 命令查看当前连接用户
if (ftp_site($conn, "WHO")) {
    echo "SITE WHO 命令已发送\n";
}

// 注意:上述命令的输出通常不会通过 ftp_site() 返回
// 要获取实际响应,需要考虑使用其他方法,如:
// 1. 启用 FTP 详细模式
// 2. 使用 ftp_raw() 函数(如果可用)
// 3. 检查服务器日志

ftp_close($conn);
?>

示例 5:与 ftp_raw() 结合使用

在某些情况下,可能需要使用 ftp_raw() 来获取 SITE 命令的实际响应。

<?php
// 注意:ftp_raw() 函数在某些 PHP 版本中可能不可用
// 这是一个高级示例,展示了如何获取 SITE 命令的实际响应

$conn = ftp_connect("ftp.example.com");
ftp_login($conn, "username", "password");

// 检查 ftp_raw() 函数是否可用
if (function_exists('ftp_raw')) {
    echo "ftp_raw() 函数可用,可以获取服务器响应\n";

    // 使用 ftp_raw() 发送 SITE HELP 命令并获取响应
    $response = ftp_raw($conn, "SITE HELP");

    if ($response) {
        echo "服务器响应:\n";
        foreach ($response as $line) {
            echo htmlspecialchars($line) . "\n";
        }
    } else {
        echo "获取响应失败\n";
    }
} else {
    echo "ftp_raw() 函数不可用\n";
    echo "尝试使用 ftp_site() 发送命令...\n";

    // 回退到使用 ftp_site()
    if (ftp_site($conn, "HELP")) {
        echo "SITE HELP 命令已发送,但无法获取响应文本\n";
        echo "请检查服务器文档或使用其他方法获取命令输出\n";
    }
}

ftp_close($conn);
?>

注意事项

  • 服务器特定性:SITE 命令是服务器特定的,不同 FTP 服务器软件(如 vsftpd、ProFTPD、Pure-FTPd)支持不同的 SITE 命令。
  • 权限要求:某些 SITE 命令可能需要管理员或特殊权限才能执行。
  • 无返回值:ftp_site() 只返回命令是否成功发送,不返回命令执行的结果或输出。
  • 错误处理:即使命令发送成功,服务器也可能返回错误。需要额外的机制来检查命令执行结果。
  • 兼容性:在生产环境中使用 SITE 命令前,应在测试环境中验证服务器是否支持该命令。
  • 安全性:某些 SITE 命令可能具有安全风险,应谨慎使用并遵循服务器的最佳实践。
  • 替代方案:对于常见的操作(如更改权限),可能有标准的 FTP 命令或 PHP 函数可用,应优先使用这些标准方法。

故障排除

问题 可能的原因和解决方案
SITE 命令失败 服务器不支持该命令。使用 SITE HELP 查看支持的命令列表。
权限更改不生效 服务器可能配置为忽略 CHMOD 命令,或用户没有足够权限。
无法获取命令输出 ftp_site() 不返回命令输出。考虑使用 ftp_raw() 或启用 FTP 详细日志。
命令被忽略 某些服务器需要特定配置才能启用 SITE 命令支持。
连接断开 某些 SITE 命令可能导致服务器断开连接,特别是管理命令。

相关函数