is_writable()返回false

时间:2010-01-23 11:04:20

标签: php fwrite

我期待PHP函数fwrite()

出现问题
$filename = 'rss.xml';  

if (file_exists($filename)) {
    echo "The file $filename exists";
} 

if (is_writable($filename)) {
    $fp = fopen($filename, 'w');
    fwrite($fp, $feed);
    fclose($fp);
 }
else{
    echo '<br />not writable..';
    if(!is_readable($filename)){
    echo ' and not readable!';
    }
}

执行脚本后返回:

The file rss.xml exists
not writable.. 

rss.xml的chmod为755,安全模式已关闭。

我在(mt)mediatemple.com上托管了(dv),当我在(gs)解决方案上托管时,脚本工作正常。

我找不到错误的原因= /

6 个答案:

答案 0 :(得分:3)

755表示:

  • rwx:读取,写入,执行所有者
  • r-x:读取,执行群组
  • r-x:读取,执行其他人

因此,每个人都可以阅读(并执行)该文件,但只有所有者才能写入。

拥有该文件的用户可能不是运行PHP脚本的用户?即文件可能属于任何人,而您的脚本由Apache的用户(通常是www-data运行?


第一个想法可能是删除文件,让你的脚本尝试重新创建它;如果它被正确地重新创建(这意味着Apache对包含它的directoy有write权限),那么它应该能够修改它。

否则,您应该尝试将write权限授予other - 如果您的脚本由另一个用户运行而不是该文件的所有者; chmod o+w rss.xml应该做到这一点。

答案 1 :(得分:0)

755表示文件的所有者可以修改它,但不能修改其他任何人。所有者可能不是Web服务器而是您自己(您的FTP帐户?),因此PHP无法修改它。尽量给予更广泛的支持。从775开始,如果不起作用,请尝试777。

有些Web主机以与FTP帐户相同的用户身份运行Web服务器,因此他们不会获得有关文件权限的支持问题,但在我看来,这是一个很大的安全漏洞。我认为Mediatemple做正确的事情是不要将Web服务器作为您的FTP帐户运行。

答案 2 :(得分:0)

  编辑:我忽略了这一点,正如Pascal Martin和其他人指出的那样,755可能意味着该文件是合法的不可写的,您可能需要777或更改所有者。我留下这个答案,以防万一设置正确,并且is_writable()仍然返回false,这就是我所假设的。

奇。在is_writable User Contributed Notes中对此进行了简短的讨论。对于那里的帖子,切换到PHP 5解决了它(虽然我怀疑它是服务器/ PHP /哪个进程运行的用户问题)。

你可以试试:

  • 使用posix_getuid()
  • 找出运行PHP的用户
  • 将您尝试写入的文件的所有者更改为该用户(而不仅仅是该群组)
  • 如果它可以工作,那可能真的是某种故障,你可能不得不考虑尝试一个fopen()并在它失败时拦截它的错误信息。

当然:当你绕过检查时文件是否真的有fwrite()?

答案 3 :(得分:0)

在不同的主机上,PHP运行并以

的形式访问文件

所有者

GROUP

WORLD

第一个变体是最适合您的安全性。

在这种情况下,您应该设置文件权限644,在最后一种情况下 - 666。

如果只在那里存储数据,为什么要设置777并使文件可执行?

答案 4 :(得分:0)

创建一个文件夹,用于保存具有0777权限的文件,然后以低权限级别0644将文件放入其中。因此,每个人都可以访问该文件夹但不是每个人都可以更改文件(0644) =这就是我找到的最佳解决方案。 另一个不太安全的解决方案是不要创建文件夹,只是将文件权限更改为666或者有些人更喜欢777 =不是一个好的安全解决方案

答案 5 :(得分:-1)

CHMOD 0755表示只有文件所有者才能写入(组和其他人可以读取和执行)。您应该将CHMOD更改为0775甚至0777,具体取决于PHP的用户/组。