gpt4 book ai didi

php - 为什么有权限被拒绝的警告但无论如何都成功打开了文件?

转载 作者:行者123 更新时间:2023-12-02 05:14:59 24 4
gpt4 key购买 nike

我试图在 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();
}

.../* 许多私有(private)和公共(public)函数 */

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

最佳答案

问题可能是您忘记使用 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);
}

关于php - 为什么有权限被拒绝的警告但无论如何都成功打开了文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1378827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com