Fopen创建了这个文件,那么为什么fwrite会失败呢?


fopen creates the file, so why is the fwrite failing?

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

<?
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'消息(没有显示其他错误输出)。

相同的脚本工作得很好,当我上传到我的真实服务器,所以我完全难倒了,为什么它不会写入文件;可能是我的虚拟服务器出了问题。

看起来很可悲,但它让我发疯了!在谷歌上搜索了相当长的时间都没有得到答案,所以这里有人能提供一些见解吗?多谢。

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

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

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

不需要打开和关闭文件指针,因为函数会自动处理。:)

解决!是我的虚拟服务器磁盘空间错误。在我的脑海里,我知道我在其他地方看到过这个写失败的问题,但是在这个例子中,我没有建立连接。

@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谢谢你,但是删除"or die('fwrite failed')"部分并没有导致任何进一步的错误信息-这就是令人沮丧的地方:很遗憾,脚本开头的那些错误报告指令似乎没有做太多。

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