Neden inkar izni bir uyarı var ama başarılı yine dosyasını açtı?

4 Cevap php

Ben PHP fopen () fonksiyonu ile bir dosyayı açmak için çalıştı ve o akışı açmak için başarısızlık çıkış uyarı: izni reddedildi. Sen apache belirli bir dosyayı açmak için yeterli ayrıcalıklara sahip değil karşılaşabileceğiniz uyarı / hata olduğunu biliyorum.

Ancak görüntülenen uyarı mesajında ​​rağmen, benim PHP komut başarıyla dosya açtı ve içine bir dize yazdı. Bu mantıklı değil.

Peki ne oluyor? I fopen () hemen önce @ koyabilirsiniz ama yine de garip ve ben PHP bu şekilde davranır neden bilmek istiyorum. Ben doğru konfigüre etmediyseniz bir şey var mı?

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();
    }

... / * Kamu ve özel fonksiyonlar birçok * /

    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. */
    }
}

EDIT: Yani açılan dosyaya bir şey yazmak çalıştığınızda her ilk kez, her şey yolunda. Dosyaya değişiklikleri yazmak için) (> tamamlama - sınıf sayfa kaldırıldığında tekrar dosyadaki tüm değişiklikleri işlemek için çalışırsa o zaman, o tahrip edilecek nesne, bu __ imha () yöntemini çağırır ve $ bu durumda, - hata oluşur ve bu dosya ve reddedildi mesajı pompalama yazmak için reddediyor zaman bu. Bu garip.

4 Cevap

Sorun fclose ile dosyayı kapatmak için unutmak olabilir.

Since you open the file, write stuff, and then try to open your already opened file. This might be the cause of the permission denial.

Taahhüt işlevi aşağıdaki gibi görünmelidir:

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

Eğer bu olursa, bu dosya var yok ya her zaman "izin engellendi" aldığınızdan emin misiniz? Bu dosya bulunduğu klasör izni nedir? Bunu okuma erişimi verilmiş, ancak örneğin idam etmemiş olabilir.

File_put_contents () kullanmayı deneyin .... ama aynı uyarıları çıkaracağını inanıyoruz ...

Eğer __ imha o dışında zaman size uyarı veriyor mu? Bununla ilgili bir şey olabilir. Ya apache izinleri yazmak ama okumak değil mi?