【问题标题】:fopen creates the file, so why is the fwrite failing?fopen 创建文件,为什么 fwrite 失败?
【发布时间】:2016-10-05 20:08:42
【问题描述】:

我在我的电脑上运行的虚拟服务器(Oracle Virtual Box)实例中的 Ubuntu 系统上运行了这个愚蠢的小测试 PHP 脚本:

<?
error_reporting(E_ALL);
ini_set('display_errors', 1); // show errors

echo "<p>test</p>";

$filename = "andy.txt";
$fh = fopen($filename, 'w')  or die('fopen failed');
fwrite($fh, "qwerty")  or die('fwrite failed');
fclose($fh);
?>

尽管设置了所有适当的目录和文件权限,但 fwrite 失败。 fopen 工作并创建文件,因此显然启用了写访问,但是 fwrite 死了,并且输出了“fwrite failed”消息(没有显示其他错误输出)。

当我上传到我的真实服务器时,相同的脚本运行良好,所以我完全不知道为什么它不会写入文件;可能是我的虚拟服务器引起了问题。

看起来很可悲,但它让我发疯!谷歌搜索有相当长的时间未能给出答案,所以这里的任何人都可以提供一些见解吗?非常感谢。

【问题讨论】:

  • 删除or die('fwrite failed') 部分,看看它会产生什么错误
  • 你启用了 SELinux 吗?

标签: php fwrite


【解决方案1】:

不确定为什么fwrite() 调用会死掉,因为它返回写入的字节数。

也就是说,您是否尝试过使用 file_put_contents() 代替?这是一种更简单的写入文件的方式,并且是自早期 PHP 5 以来的推荐方式。
有了它,您只需要执行以下操作

$filename = "andy.txt";
if(!file_put_contents ($contents, $filename)) {
    // Write failed!
}

无需费心打开和关闭文件指针,因为这是由函数自动处理的。 :)

【讨论】:

    【解决方案2】:

    解决了!这是我的虚拟服务器上的磁盘空间错误。在我的脑海里,我知道我在其他地方看到过这个问题,因为写入失败,但在这种情况下,我无法建立联系。

    @ChristianF 谢谢!切换到 file_put_contents() 非常有帮助,因为它也失败了,但给了我一个有意义的错误消息:

    'file_put_contents(): Only 0 of 6 bytes written, possibly out of free disk space'
    

    啊哈!回想起不断增长的日志文件可能会成为一个问题,我自己删除了 /var/log 中的所有内容(保存它们之后)和 Presto!现在可以了!所以,谢谢你的提示 - 从现在开始我将切换到使用 file_put_contents。 BTW: error.log 本身的内容是 2GB,而 /var/log 中其他所有内容的剩余大小只有 15MB 左右,但是自己删除 error.log 不起作用,所以我删除了所有内容。

    @Clayton Smith 谢谢,但删除“或死('fwrite failed')”部分并没有导致任何进一步的错误信息 - 这是令人沮丧的:很遗憾那些错误报告指令一开始的脚本似乎没有做太多。

    @NaeiKinDus 谢谢,但我认为我没有运行 SELinux(恐怕我对此一无所知)。虽然我有一个 /etc/selinux 目录,但其中没有配置文件,只是看起来是一个骨架 semanage.conf - 不管是什么。无法识别 sestatus 等命令。

    【讨论】:

    • 啊,喜欢信息丰富的错误消息。 :) 很高兴我能帮上忙,你把它搞定了。感谢您回来告诉我们真正的问题是什么。 :)
    • 糟糕!没有完全解决。删除所有日志造成了它自己的问题 - 我不应该如此漫不经心。 Apache 失败了,因为它找不到它的日志文件,并且 MySQL 现在无法启动,但我猜这是另一个故事。
    • 嘿,这不是很典型吗...我建议在服务器上设置日志轮换,从长远来看将为您节省很多麻烦!
    猜你喜欢
    • 2019-10-19
    • 2015-05-24
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2013-02-26
    相关资源
    最近更新 更多