PHP中的chmod()函数无法改变文件权限

9

我在使用图片上传脚本时遇到了问题。

我知道有很多类似的问题,但是我还没有找到适合我的解决方法。

$upload_dir = "images/postcards/";
chmod($upload_dir, 777);
if (is_writable($upload_dir)) {
    echo 'The file is writable';
} else {
    echo 'The file is not writable';
}

这总是返回文件“不可写”

我尝试将 chmod 设置为 0777-rwxrwxrwx。但结果始终相同。有什么想法吗?


1
在十进制中,777 是不正确的。你应该始终在前面加上 0,请查看这里 chmod - Madan Sapkota
4个回答

13

该目录必须归属于调用脚本的用户(通常是 www-dataapache 或者 httpd 如果你正在 apache/*NIX 环境下运行脚本)。用户无法在不拥有目录的情况下设置 777 权限。

请参阅 chmod() manual 中的注意事项:

当前用户是 PHP 运行的用户,它可能不是您正常使用的 shell 或 FTP 访问的相同用户。在大多数系统上,模式只能由拥有文件的用户更改。


2

首先,在您的代码顶部添加两行以打开PHP error_report,查看是否有来自chmod的错误:

ini_set('display_errors', true);
error_reporting(E_ALL);

请确保您的Web服务器对该目录具有权限,我猜测Web服务器没有权限。


哇,非常感谢错误报告工具。我一直在试图安装类似Chrome Logger的东西来获取PHP的错误报告,结果一直碰壁。 - user124384

0

我之前也遇到过同样的问题,你可以通过以下代码更改文件权限:

<?php
$ftp_details['ftp_user_name'] = 'your ftp username';
$ftp_details['ftp_user_pass'] = 'your ftp password';
$ftp_details['ftp_root'] = '/public_html/';
$ftp_details['ftp_server'] = 'ftp' . $_SERVER['HTTP_HOST'];
function ftp_chmod($path, $mod, $ftp_details) {
  extract($ftp_details);
  $conn_id = ftp_connect($ftp_server);
  $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// try to chmod $path directory
  if (ftp_site($conn_id, 'CHMOD ' . $mod . ' ' . $ftp_root . $path) !== false) {
    $success = true;
  }
  else {
    $success = false;
  }

  ftp_close($conn_id);
  return $success;
}
?>

我没有运行这段代码,但我认为它是可以的,并且会对你有所帮助。 如果你的问题解决了,请告诉我。


0

我使用chmod时遇到了类似的问题,尽管文件属于apache:apache(Web服务器用户)。在我的情况下,SELinux成为了障碍,禁用它使这一点变得清楚:

sudo setenforce 0

现在可以使用chmod了。现在要想办法为此情况创建一个SELinux异常...

(当然不要忘记启用SELinux)


改进你的答案,使其更加全面。 - Pramod S. Nikam
这是我特定情况下的最佳答案,因为我已经为该文件设置了正确的用户和组。另外在服务器配置方面,我也发现为我的 Web 服务器设置新的 umask 是最佳选项:http://serverfault.com/a/384922/185510 - RibeiroBreno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接