PHP Conference Japan 2024

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
15 年前
使用优秀的 octdec 和 decoct 函数可以简化此操作

<?php
$mode
= "644";
$mode = octdec( str_pad($mode,4,'0',STR_PAD_LEFT) );
ftp_chmod($ftp_stream, $mode, $file);
?>
DanN
15 年前
只想为那些仍然在通过 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 将其从八进制转换为十进制,然后转换回 decoct,但没有任何效果。这是我唯一能够使其工作的办法,使用 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年前
好的,
所以如果两个人说我的方法是错的,而另一种方法是对的,我会收回我的说法。
我发布它是因为对我来说,我使用的方式有效(我不知道为什么)。

而且:我不会说类似“我会在发布前尝试”之类的话,在我看来,这真的很不友好,因为我已经尝试过了!
Josh at jcr dot com
17年前
rabin的代码作为ftp_chmod()的替代品运行良好。
对于PHP 5之前的安装,我会先尝试这个,然后再尝试cspiegl的解决方案。
To Top