PHP Conference Japan 2024

chmod

(PHP 4, PHP 5, PHP 7, PHP 8)

chmod更改文件模式

描述

chmod(字符串 $filename, 整数 $permissions): 布尔值

尝试将指定文件的模式更改为permissions中给定的模式。

参数

filename

文件的路径。

permissions

请注意,permissions不会自动假定为八进制值,因此为了确保预期的操作,您需要在permissions前加上零 (0)。诸如“g+w”之类的字符串将无法正常工作。

<?php
chmod
("/somedir/somefile", 755); // 十进制;可能不正确
chmod("/somedir/somefile", "u+rwx,go+rx"); // 字符串;不正确
chmod("/somedir/somefile", 0755); // 八进制;正确的模式值
?>

permissions参数由三个八进制数字组成,分别指定所有者、所有者所属的用户组以及其他所有用户的访问限制,顺序依次是所有者、所属用户组、其他用户。可以通过将目标用户基的所需权限加起来来计算一个组件。数字 1 表示授予执行权限,数字 2 表示使文件可写,数字 4 表示使文件可读。将这些数字加起来以指定所需的权限。您还可以使用“man 1 chmod”和“man 2 chmod”在 Unix 系统上阅读更多关于模式的信息。

<?php
// 所有者可读和可写,其他用户无权限
chmod("/somedir/somefile", 0600);

// 所有者可读和可写,其他用户可读
chmod("/somedir/somefile", 0644);

// 所有者拥有所有权限,其他用户可读和可执行
chmod("/somedir/somefile", 0755);

// 所有者拥有所有权限,所有者组可读和可执行
chmod("/somedir/somefile", 0750);
?>

返回值

成功时返回true,失败时返回false

错误/异常

失败时,会发出E_WARNING

注释

注意:

当前用户是运行 PHP 的用户。这可能与您用于普通 shell 或 FTP 访问的用户不同。在大多数系统上,只有文件所有者才能更改模式。

注意此函数不适用于远程文件,因为必须通过服务器的文件系统访问要检查的文件。

参见

添加注释

用户贡献的注释 6 条注释

MethodicalFool
14 年前
注意,注释中的一些示例建议执行以下操作

chmod(file_or_dir_name, intval($mode, 8));

但是,如果 $mode 是整数,则 intval() 不会修改它。因此,这段代码…

$mode = 644;
chmod('/tmp/test', intval($mode, 8));

…生成的权限如下所示

1--w----r-T

相反,使用 octdec(),如下所示

chmod(file_or_dir_name, octdec($mode));

另见:https://php.net/manual/en/function.octdec.php
Geoff W
14 年前
注意使用第二个参数的引号…

如果您使用引号,例如

chmod (file, "0644");

php 不会报错,但在运行 chmod 之前会隐式转换为 int。不幸的是,隐式转换没有考虑八进制字符串,因此最终得到整数版本 644,它是八进制 1204。
masha at mail dot ru
19 年前
有用的参考

值 权限级别
400 所有者可读
200 所有者可写
100 所有者可执行
40 组可读
20 组可写
10 组可执行
4 全局可读
2 全局可写
1 全局可执行

(摘自 http://www.onlamp.com/pub/a/php/2003/02/06/php_foundations.html)
chris at ocproducts dot com
4 年前
Windows 的文件权限模型与 Unix 大相径庭,并且仅在极小程度上集成它们。

在 Windows 上,此函数只能更改“只读”标志,如果 $mode & 0200 未通过,则将其打开。
即,它只检查 u+w 是否缺少位掩码,如果缺少,则设置只读标志。

可执行标志无法设置,因为 Windows 根据文件扩展名确定它。
可写标志无法设置,因为 Windows 根据 ACL 确定写访问权限,而此处未集成 ACL。
alex at feidesign dot com
19 年前
如果您由于 safe_mode 限制而无法使用 PHP 更改文件/目录的 chmod,但可以使用 FTP 来更改它们的 chmod,只需使用 PHP 的 FTP 函数(例如 ftp_chmod 或 ftp_site)即可。效率不高,但有效。
sander
15 年前
如果您还想对目录使用 chmod,请使用以下代码

<?php
$iterator
= new RecursiveIteratorIterator(new RecursiveDirectoryIterator($pathname), RecursiveIteratorIterator::SELF_FIRST);

foreach(
$iterator as $item) {
chmod($item, $filemode);
}
?>
To Top