2012-04-29 80 views
4

由于这篇文章的标题的文件否认的是几乎不言自明,我就跳到代码:的fopen权限与777个权限

echo sprintf('%o', fileperms('test.txt'))."<br/>"; 

fopen("test.txt", "w"); 

而与此我得到:

100777 
fopen(test.txt): failed to open stream: Permission denied 

任何想法?

编辑:问题解决:服务器上存在未正确配置的访问控制列表。

谢谢!

+1

也许SElinux阻止你?在文件上试试'ls -Z'。 – kichik

回答

4

我认为它可能对文件有写/读权限,但对文件夹没有写权限。在您的网站的公共根目录中查看,看看您是否可以读取或写入文件。

对于安全模式(http://php.net/manual/en/function.fopen.php),PHP文档说以下内容:

注:当安全模式被激活,PHP将检查 该脚本的操作的目录是否有相同的UID(所有者)作为正在执行的脚本 。

最后你还需要确保php有权访问你正在尝试写入的文件夹。

+0

我会看看安全模式是否启用。至于该文件夹,权限也设置为777. – personne3000

0

我想你所遇到的问题是文件的所有权问题......你可以用它来找出问题

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

$file = "a.jpg"; 

echo sprintf ('%o', fileperms ($file)), PHP_EOL; 
echo posix_getpwuid (fileowner ($file)), PHP_EOL; // Get Owner 
echo posix_getpwuid (posix_getuid()), PHP_EOL; // Get User 

if (is_file ($file)) { 
    echo "is_file", PHP_EOL; 
    ; 
} 

if (is_readable ($file)) { 
    echo "is_readable", PHP_EOL; 
    ; 
} 

if (is_writable ($file)) { 
    echo "is_readable", PHP_EOL; 
} 

fopen ($file, "w"); 
+0

感谢您的答案,一切运行良好,直到“is_writable”(该文件显然不是)。所有者和用户不是一样的,但它不应该是一个问题,因为每个用户都有对这个文件的写权限......对吗? – personne3000

+0

这可能是一个问题......除非你有root用户..你很多人不能写入文件.. .try通过'chown'改变所有权http://php.net/manual/en/function .chown.php和chnage文件许可,使用'chmod' http://php.net/manual/en/function.chmod.php – Baba

+0

我会要求服务器管理员来做这个事情。但是,我仍然不明白为什么PHP不能写入一个文件,如果所有用户都被允许写入文件:-s – personne3000

0

我只是碰到了这个问题,不幸的是,错误信息没有提供任何线索实际的原因。我必须将777赋给包含在给出错误信息的文件中的类的文件。该错误信息仅表示调用该类的php文件,该文件已经具有777.

因此,请检查错误消息(比如说index.php)中提到的文件,然后检查哪些类在其中实例化该文件(class-file.php,class-writer.php等)。然后检查这些文件的权限(class-file.php,class-writer.php)。

一旦我授予了类文件的权限,它就可以正常工作。也许网络主机改变了他们的配置,因为一切工作到几天前。

0

我有同样的问题:文件夹是777,但fopen不起作用。 fopen表示允许否认。确保您的脚本具有“良好”的权限。也许它会帮助你:

echo $dst, file_exists($dst) ? ' exists' : ' does not exist', "\n"; 
echo $dst, is_readable($dst) ? ' is readable' : ' is NOT readable', "\n"; 
echo $dst, is_writable($dst) ? ' is writable' : ' is NOT writable', "\n"; 
$fh = fopen($dst, 'w'); 
if (!$fh) { 
    echo ' last error: '; 
    var_dump(error_get_last()); 
}