权限被拒绝 - PHP unlink

34

我有两个文件:b.php和test.txt

<?php 
$b = "test.txt";
unlink($b);
?>

错误提示:警告:unlink(test.txt) [function.unlink]: Permission denied

为什么?b.php 和 test.txt 都是 777,且属于同一组/登录用户。

如果我将父级目录设置为 777,我可以执行 unlink,但我必须将权限设为 777,然后再设为 755?


1
它们是否在同一个目录下? - Explosion Pills
1
可能是因为运行 PHP 代码的进程需要对它们所在的目录具有写入权限。 - Martin Sommervold
1
这是网站的一部分吗?如果是,您需要确保Web服务器进程具有目录和/或文件的权限。 - akatakritos
1
检查父目录的权限。尝试在父目录上设置777,看看是否有任何变化。 - craig1231
验证码的.htaccess文件:拒绝所有访问,当更改为允许所有访问时,不再显示错误消息。 - khaled_webdev
显示剩余4条评论
6个回答

39

你(作为运行b.php的进程,无论是通过CLI还是Web服务器)需要对包含文件的目录拥有写入访问权限。你正在更新目录内容,因此仅对文件进行访问是不够的。

请注意,如果你使用PHP的chmod()函数将文件或文件夹的模式设置为777,则应使用0777以确保数字被正确解释为八进制数。


chmod php 示例:chmod("/somedir/somefile", 777); https://www.php.net/manual/en/function.chmod.php 还要注意:文件夹本身必须对所有人可执行。 - Avatar

21

您需要首先使用fclose($handle);关闭文件,因为该文件正在使用中,所以无法删除。因此,请先关闭文件,然后再尝试删除。


10
除了其他朋友的回答以外,如果有人正在寻找删除“文件夹”而非“文件”的方法,应该注意文件夹必须使用php rmdir()函数进行删除。如果使用unlink()删除“文件夹”,将会遇到错误警告信息“权限被拒绝”。
然而,您可以通过mkdir()创建文件夹和文件,但是删除文件夹(rmdir())的方式与删除文件(unlink())的方式不同。
最终作为一个事实:

在许多编程语言中,任何与权限相关的错误都可能不直接表示实际的权限问题。

例如,如果您想使用node fs模块readSync读取不存在的文件,则会遇到错误的EPERM错误。

2
// Path relative to where the php file is or absolute server path
chdir($FilePath); // Comment this out if you are on the same folder
chown($FileName,465); //Insert an Invalid UserId to set to Nobody Owner; for instance 465
$do = unlink($FileName);

if($do=="1"){ 
    echo "The file was deleted successfully."; 
} else { echo "There was an error trying to delete the file."; } 

试一下这个,希望能有所帮助。


1
chown() [function.chown]:操作不允许。 - eugui
这可能是因为您没有更改文件所有权的权限。您可以尝试更改文件的权限以查看是否会更改(例如,chmod("test.txt", 0666))。您还可以尝试在666上取消链接以查看发生了什么。有没有办法查看拥有该文件的用户? - Ardi

1
文件权限正常(0777),但我认为你在共享服务器上,因此要正确删除文件,请执行以下操作: 1. 创建正确的文件路径。
// delete from folder
$filename = 'test.txt';
$ifile = '/newy/made/link/uploads/'. $filename; // this is the actual path to the file you want to delete.
unlink($_SERVER['DOCUMENT_ROOT'] .$ifile); // use server document root
// your file will be removed from the folder

那段小代码可以神奇地从任何文件夹中删除您想要删除的任何选定文件,前提是实际文件路径已经收集好。

0

在Windows和PHP版本7.3.0之前,请检查您的文件在unlink之前是否已关闭,
https://www.php.net/manual/en/function.unlink.php所述:

在Windows上,现在可以unlink()正在使用句柄的文件,而以前会失败。但是,在所有对其的句柄关闭之前,仍无法重新创建未链接的文件。

例如:

$fullFilePath = 'C:\Users\MyUserName\www\myApp\public\test.txt';
$handle = fopen($fullFilePath , 'w+');

fopen($filePath, 'w+');
fputs($handle, 'Some text in the file');
fclose($handle);

unlink(realpath($insertedLinesFilePath));

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