PHP ftp_chmod() 函数

ftp_chmod() 函数通过FTP连接设置文件或目录的权限。

注意:该函数需要PHP FTP扩展支持。确保在php.ini中启用了ftp扩展(extension=ftp)。

语法

ftp_chmod(resource $ftp_stream, int $mode, string $filename)

参数说明

参数 描述
$ftp_stream 必需。FTP连接的资源标识符,由ftp_connect()ftp_ssl_connect()返回。
$mode 必需。要设置的权限值,使用八进制表示法(例如:0755)。
常用权限值:
  • 0644 - 文件(所有者可读写,其他只读)
  • 0755 - 目录/可执行文件(所有者全权限,其他读执行)
  • 0777 - 完全权限(不推荐用于安全考虑)
$filename 必需。远程服务器上的文件或目录路径。

返回值

  • 成功时返回新的权限值(八进制数)
  • 失败时返回 false

示例

示例1:基本使用

连接到FTP服务器并设置文件权限:

<?php
// 连接参数
$ftp_server = "ftp.example.com";
$ftp_user = "username";
$ftp_pass = "password";

// 建立连接
$conn_id = ftp_connect($ftp_server);
if ($conn_id) {
    // 登录
    $login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);

    if ($login_result) {
        echo "FTP连接成功\n";

        // 设置文件权限为0644
        $file = "public_html/index.php";
        if (ftp_chmod($conn_id, 0644, $file) !== false) {
            echo "文件 '{$file}' 权限已设置为0644\n";
        } else {
            echo "设置权限失败\n";
        }

        // 设置目录权限为0755
        $dir = "public_html/uploads";
        if (ftp_chmod($conn_id, 0755, $dir) !== false) {
            echo "目录 '{$dir}' 权限已设置为0755\n";
        } else {
            echo "设置目录权限失败\n";
        }
    } else {
        echo "FTP登录失败\n";
    }

    // 关闭连接
    ftp_close($conn_id);
} else {
    echo "无法连接到 {$ftp_server}\n";
}
?>

示例2:使用SSL安全连接

<?php
// 使用SSL安全连接
$ftp_server = "ftp.example.com";
$ftp_user = "username";
$ftp_pass = "password";

// 建立SSL连接
$conn_id = ftp_ssl_connect($ftp_server);
if ($conn_id) {
    if (ftp_login($conn_id, $ftp_user, $ftp_pass)) {
        // 开启被动模式(某些服务器需要)
        ftp_pasv($conn_id, true);

        // 设置可执行文件权限
        $script = "public_html/cgi-bin/script.cgi";
        if (ftp_chmod($conn_id, 0755, $script)) {
            echo "脚本 '{$script}' 已设置为可执行\n";
        }

        // 设置配置文件权限为只读
        $config = "public_html/config.ini";
        if (ftp_chmod($conn_id, 0644, $config)) {
            echo "配置文件 '{$config}' 权限已设置\n";
        }
    }

    ftp_close($conn_id);
}
?>

示例3:批量设置权限

<?php
// 批量设置网站文件权限
function setWebPermissions($ftp_conn, $directory) {
    $files = ftp_nlist($ftp_conn, $directory);

    foreach ($files as $file) {
        // 获取文件信息判断类型
        $file_info = ftp_rawlist($ftp_conn, $file);

        // 简单判断是否为目录(根据rawlist返回的字符串)
        if (strpos($file_info[0], 'd') === 0) {
            // 目录设置为0755
            ftp_chmod($ftp_conn, 0755, $file);
            echo "目录: {$file} - 0755\n";

            // 递归处理子目录
            setWebPermissions($ftp_conn, $file);
        } else {
            // 根据扩展名设置文件权限
            $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
            switch ($ext) {
                case 'php':
                case 'cgi':
                case 'pl':
                    // 可执行脚本
                    ftp_chmod($ftp_conn, 0755, $file);
                    echo "脚本: {$file} - 0755\n";
                    break;
                case 'txt':
                case 'ini':
                case 'conf':
                    // 配置文件
                    ftp_chmod($ftp_conn, 0644, $file);
                    echo "配置: {$file} - 0644\n";
                    break;
                default:
                    // 普通文件
                    ftp_chmod($ftp_conn, 0644, $file);
                    echo "文件: {$file} - 0644\n";
            }
        }
    }
}

// 使用示例
$conn = ftp_connect("ftp.example.com");
if ($conn && ftp_login($conn, "user", "pass")) {
    setWebPermissions($conn, "public_html");
    ftp_close($conn);
}
?>

示例4:错误处理

<?php
// 带有错误处理的权限设置
function safeFtpChmod($ftp_conn, $mode, $filename) {
    // 检查连接是否有效
    if (!is_resource($ftp_conn)) {
        trigger_error("无效的FTP连接", E_USER_WARNING);
        return false;
    }

    // 检查文件是否存在
    $file_size = ftp_size($ftp_conn, $filename);
    if ($file_size == -1) {
        trigger_error("文件 '{$filename}' 不存在", E_USER_WARNING);
        return false;
    }

    // 设置权限
    $result = ftp_chmod($ftp_conn, $mode, $filename);

    if ($result === false) {
        trigger_error("无法设置 '{$filename}' 的权限", E_USER_WARNING);
        return false;
    }

    // 验证权限是否设置成功
    $actual_mode = decoct($result);
    $expected_mode = decoct($mode);

    if ($actual_mode != $expected_mode) {
        trigger_error("权限设置不匹配:期望{$expected_mode},实际{$actual_mode}", E_USER_NOTICE);
    }

    return $result;
}

// 使用示例
$conn = ftp_connect("ftp.example.com");
if ($conn && ftp_login($conn, "user", "pass")) {
    $result = safeFtpChmod($conn, 0644, "public_html/index.php");
    if ($result !== false) {
        echo "权限设置成功,新权限:" . decoct($result) . "\n";
    }
    ftp_close($conn);
}
?>

权限值说明

八进制权限表示法:

权限 数字 说明
--- 0 无权限
--x 1 执行
-w- 2 写入
-wx 3 写入+执行
r-- 4 读取
r-x 5 读取+执行
rw- 6 读取+写入
rwx 7 读取+写入+执行

三位数字分别代表:所有者、组用户、其他用户

例如:0755 = 所有者(rwx)、组用户(r-x)、其他用户(r-x)

常见问题

  • FTP连接无效或已关闭
  • 文件或目录不存在
  • FTP用户权限不足
  • FTP服务器不支持CHMOD命令
  • 路径错误或包含非法字符

<?php
if (extension_loaded('ftp')) {
    echo "FTP扩展已启用";
} else {
    echo "FTP扩展未启用";
    // 在php.ini中添加:extension=ftp
}
?>

<?php
$result = ftp_chmod($conn, 0755, "file.txt");
if ($result !== false) {
    echo "权限值:" . decoct($result); // 输出:755
    echo "权限设置成功";
}
?>

相关函数

函数 描述
ftp_connect() 建立FTP连接
ftp_login() 登录FTP服务器
ftp_close() 关闭FTP连接
ftp_ssl_connect() 建立SSL-FTP连接
chmod() 设置本地文件权限
安全警告:
  • 避免使用0777权限,这可能导致安全风险
  • 使用SSL连接(ftp_ssl_connect)传输敏感信息
  • 不要将FTP凭证硬编码在代码中,使用配置文件或环境变量
  • 定期更新FTP服务器软件以修复安全漏洞