为什么有权限被拒绝的警告但是成功地打开了文件?

时间:2009-09-04 12:02:37

标签: php permissions

我尝试在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()将更改写入文件 - 这是错误发生时,它拒绝写入文件并放弃权限被拒绝的消息。这很奇怪。

4 个答案:

答案 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);
}