ftp_chmod

(PHP 5, PHP 7, PHP 8)

ftp_chmod通过 FTP 设置文件权限

描述

ftp_chmod(FTP\Connection $ftp, int $permissions, string $filename): int|false

将指定远程文件的权限设置为 permissions

参数

ftp

一个 FTP\Connection 实例。

permissions

新的权限,以八进制值给出。

filename

远程文件。

返回值

成功时返回新的文件权限,错误时返回 false

变更日志

版本 描述
8.1.0 ftp 参数现在期望一个 FTP\Connection 实例;以前,期望一个 资源

示例

示例 #1 ftp_chmod() 示例

<?php
$file
= 'public_html/index.php';

// 设置基本连接
$ftp = ftp_connect($ftp_server);

// 使用用户名和密码登录
$login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);

// 尝试将 $file 的权限更改为 644
if (ftp_chmod($ftp, 0644, $file) !== false) {
echo
"$file 已成功更改权限为 644\n";
} else {
echo
"无法更改 $file 的权限\n";
}

// 关闭连接
ftp_close($ftp);
?>

参见

添加注释

用户贡献的注释 7 个注释

Maarten Wolzak
14 年前
使用出色的 octdec 和 decoct 函数,您可以轻松实现这一点

<?php
$mode
= "644";
$mode = octdec( str_pad($mode,4,'0',STR_PAD_LEFT) );
ftp_chmod($ftp_stream, $mode, $file);
?>
DanN
14 年前
只想为那些在通过 FTP 更改权限时仍然遇到问题的人贡献一个简短的说明。

如果您在 PHP 识别模式为整数时遇到问题,可以使用前一个海报的方法

$mode = octdec ( str_pad ( $mode, 4, '0', STR_PAD_LEFT ) );

并在其后添加以下代码段

$mode = (int) $mode;

这将强制 PHP 在您执行以下操作时识别模式为整数

ftp_chmod ( $conn_id, $mode, $path );

将这些组合在一起对我来说似乎从未失败过。
rperea at vsourceweb dot com
15 年前
我花了一段时间才弄清楚如何在自己的情况下使用此函数,因为我需要将 $mode 作为从数据库中读取的变量传递给此函数。由于数据库返回的值是整数,没有前导零,所以我无法使操作正常工作,因为在 PHP 中添加前导零会将值转换为字符串。

例如,这在我的情况下不起作用

<?php
// 假设这是从数据库返回的值。
$mode = 644;

// 现在尝试使用此值进行 chmod。
ftp_chmod($conn_id, $mode, 'test.txt');

// 文件现在的权限为 204,而不是 644
?>

添加前导零也不起作用

<?php
// 假设这是从数据库返回的值。
$mode = 644;

// 现在尝试使用此值进行 chmod。
ftp_chmod($conn_id, '0'.$mode, 'test.txt');

// 文件现在的权限为 204,而不是 644
?>

我尝试了许多方法来使其正常工作,甚至使用 octdec 将其从八进制转换为十进制,然后又转换回十进制,但什么都没用。这是我唯一能使它正常工作的方法,使用 eval 语句。

<?php
// 假设这是从数据库返回的值。
$mode = 644;

// 将模式转换为字符串
$np = '0'.$mode;

// 现在使用 eval'd 字符串作为整数运行 chmod。
ftp_chmod($conn_id, eval("return({$np});"), 'test.txt');

// 文件现在的权限为 644
?>

当然,您必须确保 $mode 的值只包含 3 位数字。在将值传递给 eval() 之前,始终对您的值进行检查。
tiefenbrunner at obdev dot at
16 年前
PHP5 ftp_chmod 函数的“mode”参数是一个整数,它应该作为八进制数给出,就像“chmod”命令行工具的参数一样。

因此 sprintf 必须使用 %o 格式字符,以便传递的整数值实际上被表示为 FTP 服务器的 CHMOD 站点命令的八进制数。

因此,在我看来,rabin 的版本是正确的(它确实对我有用)。
rabin at rab dot in
18 年前
如以下注释中所述,由“hardy add mapscene dot com”发布的函数如果与八进制模式一起使用,则会出错,而 php5 函数就是这样使用的。

此函数与 php5 函数完全一样

<?php
if (!function_exists('ftp_chmod')) {
function
ftp_chmod($ftp_stream, $mode, $filename)
{
return
ftp_site($ftp_stream, sprintf('CHMOD %o %s', $mode, $filename));
}
}
?>
cspiegl at kwask dot de
16 年前
好的,
所以如果两个人说我的方法错了,而另一个人是对的,我将收回我的说法。
我发布它是因为对我来说,我使用它的方式有效(我不知道为什么)。

AND: 我不会说“我尝试过后再发布”,在我看来这很不友好,因为我已经尝试过了!
Josh at jcr dot com
16 年前
rabin 的代码可以完美地替代 ftp_chmod()。
在尝试 cspiegl 的解决方案之前,我建议先尝试这个方法,尤其是在 PHP 5 之前的版本。
To Top