2016-10-04 36 views
1

我有一个虚拟服务器的实例里面的Ubuntu系统(Oracle虚拟盒)在我的电脑上运行上运行这个愚蠢的小测试PHP脚本:fopen创建文件,那么为什么fwrite失败?

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

当我上传到我的真实服务器时,相同的脚本工作得非常好,所以我完全难以理解它为什么不写入文件;也许这是关于我的虚拟服务器引起的问题。

看起来像这样一个可怜的东西,但它让我疯狂!相当长的时间谷歌没有得出答案,所以任何人在这里请提供一些见解?非常感谢。

+1

删除'or die('fwrite failed')'部分以查看其产生的错误 – Clay

+0

您是否启用了SELinux? – NaeiKinDus

回答

2

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

这就是说,你用file_put_contents()来代替吗?这是写入文件的一个简单的方法,是因为早期的PHP的推荐方式5.
有了它,你只需要做好以下

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

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

1

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

@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失败')”部分没有导致任何进一步的错误信息 - 这是如此令人沮丧:这是一个耻辱,那些错误报告指令在剧本的开始似乎没有太多。

@NaeiKinDus谢谢,但我不认为我有SELinux正在运行(恐怕我对此一无所知)。虽然我有一个/ etc/selinux目录,但它里面没有配置文件,只是看起来像是一个框架semanage.conf - 无论如何。诸如sestatus之类的命令无法识别。

+0

啊,得到爱信息错误信息。 :)很高兴我能帮忙,并且你已经整理出来了。感谢你回来告诉我们真正的问题是什么。 :) – ChristianF

+0

糟糕!没有完全解决。删除所有的日志创建它自己的问题 - 我不应该如此傲慢。Apache失败了,因为它无法找到它的日志文件,并且MySQL现在无法启动,但这是我猜想的另一个故事。 – schenken

+0

嘿,是不是典型的...我建议在服务器上设置日志轮换,从长远来看将为您节省很多麻烦! – ChristianF