我尝试在PHP中使用fopen()函数打开一个文件,并输出无法打开流的警告:权限被拒绝。您知道当apache没有足够的权限来打开特定文件时遇到的警告/错误。
然而,尽管显示了警告消息,但我的PHP脚本成功打开了文件并在其中写入了一个字符串。这没有意义。
那有什么关系?我可以在fopen()之前立即放置一个@但仍然很奇怪,我想知道为什么PHP会以这种方式运行。有没有我没有正确配置的东西?
class XMLDB {
private $file = null;
private $xml = null;
private $defs = array();
private $recs = array();
// private members above, public members below
public function __construct($xmlfile) {
if (!file_exists($xmlfile)) {
die('XML file does not exist.');
}
$this -> file = $xmlfile;
$this -> xml = simplexml_load_file($this -> file);
$this -> iniVocab();
$this -> iniData();
}
... / *许多私人和公共职能* /
public function commit() {
$xmlfile = fopen($this -> file, 'w'); // this is causing the warning
$doc = new DOMDocument('1.0');
$doc -> preserveWhiteSpace = false;
$doc -> loadXML($this -> xml -> asXML());
$doc -> formatOutput = true;
fwrite($xmlfile, $doc->saveXML());
}
public function __destruct() {
$this -> commit();
/* comment this line out and there won't be any warnings,
/* therefore it should trace back to here. So I found out that
/* it's when I use die() that eventually calls __destruct()
/* which in turn calls commit() to trigger this fopen warning. */
}
}
编辑:所以每次我第一次尝试写一些东西到打开的文件时,它都没问题。然后,如果类在卸载页面时尝试再次提交对文件的所有更改,即要销毁的对象,则调用__destruct()方法和$ this - > commit()将更改写入文件 - 这是错误发生时,它拒绝写入文件并放弃权限被拒绝的消息。这很奇怪。
答案 0 :(得分:0)
您是否确定无论此文件是否存在,您每次都会获得此“权限被拒绝”?此文件所在的文件夹权限是什么?您可能已授予它读取权限,但不执行例如。
答案 1 :(得分:0)
尝试使用file_put_contents()....但我相信它会发出相同的警告......
答案 2 :(得分:0)
当您在__destruct之外执行此操作时是否会发出警告?可能与此有关。或者apache有写入权限但没有读取?
答案 3 :(得分:0)
问题可能是您忘记使用fclose关闭文件。
由于您打开文件,编写内容,然后尝试打开已打开的文件。 这可能是拒绝许可的原因。
提交函数应如下所示:
public function commit() {
$xmlfile = fopen($this -> file, 'w');
$doc = new DOMDocument('1.0');
$doc -> preserveWhiteSpace = false;
$doc -> loadXML($this -> xml -> asXML());
$doc -> formatOutput = true;
fwrite($xmlfile, $doc->saveXML());
fclose($this -> file);
}