2

我期待 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 且安全模式已关闭。

我在 (dv) 上的 (mt) mediatemple.com 上托管,当我在 (gs) 解决方案上托管时,脚本运行良好。

我找不到问题所在 =/

4

6 回答 6

4

755方法 :

  • rwx: 为所有者读、写、执行
  • r-x:读取,为组执行
  • r-x: 读取、执行他人

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

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


第一个想法可能是删除文件,让您的脚本尝试重新创建它;如果它被正确地重新创建(这意味着 Apachewrite对包含它的目录具有所需的权限),它应该能够在此之后对其进行修改。

否则,您应该尝试授予write权限other-- 如果您的脚本由文件所有者以外的其他用户运行;chmod o+w rss.xml应该做的伎俩。

于 2010-01-23T11:07:47.730 回答
0

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

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

于 2010-01-23T11:10:39.860 回答
0

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

奇怪的。在is_writable User Contributed Notes中有一个简短的讨论。对于在那里发帖的人,切换到 PHP 5 解决了它(尽管我怀疑它是服务器/PHP/哪个进程作为哪个用户问题运行)。

你可以尝试什么:

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

当然:当您绕过检查时,文件实际上是否可以 fwrite()?

于 2010-01-23T11:13:41.493 回答
0

在不同的主机上,PHP 运行和访问文件或者作为

所有者

世界

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

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

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

于 2010-01-23T12:12:07.797 回答
0

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

于 2012-01-13T18:11:17.157 回答
-1

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

于 2010-01-23T11:08:56.650 回答