2009-09-04 6 views
3

J'ai essayé d'ouvrir un fichier avec la fonction fopen() en PHP et l'avertissement de sortie de l'ouverture de flux: permission refusée. Vous connaissez cet avertissement/erreur que vous rencontrez lorsque Apache n'a pas assez de privilèges pour ouvrir un fichier particulier.Pourquoi y a-t-il un avertissement d'autorisation refusée mais avec succès l'ouverture du fichier?

Cependant, malgré l'affichage du message d'avertissement, mon script PHP a réussi à ouvrir le fichier et y a écrit une chaîne. Cela n'a pas de sens.

Alors qu'est-ce que la matière? Je peux mettre un @ immédiatement avant fopen() mais c'est quand même bizarre et je veux savoir pourquoi PHP se comporte de cette façon. Y at-il quelque chose que je n'ai pas configuré correctement?

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

.../* beaucoup de fonctions publiques et privées */

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: Donc, chaque première fois que j'essaie d'écrire quelque chose dans le fichier ouvert, il est bon. Ensuite, si la classe essaie à nouveau de valider toutes les modifications du fichier lorsque la page est déchargée, c'est-à-dire l'objet à détruire, elle appelle la méthode __destruct() et $ this -> commit() pour écrire les modifications dans le fichier - C'est quand l'erreur se produit et il refuse d'écrire dans le fichier et de diffuser le message d'autorisation refusé. C'est étrange.

+0

Quelle version de PHP et OS utilisez-vous? – txyoji

+0

Debian 5.0 Lenny et PHP 5.2.6 C'est vraiment bizarre. J'ai juste essayé de chmod 777 le dossier à écrire et PHP pompe toujours l'avertissement refusé d'autorisation. Pourtant, l'opération est réussie. –

+0

Apache 2. Le fichier est assigné au groupe de données www qui est Apache. Que les permissions soient 666 ou 660, peu importe. L'opération est réussie mais PHP continue à donner l'avertissement. –

Répondre

0

Le problème peut être que vous oubliez de fermer votre fichier avec fclose.

Depuis que vous ouvrez le fichier, écrire des choses, puis essayez d'ouvrir votre fichier déjà ouvert. Cela peut être la cause du refus d'autorisation.

La fonction commit devrait ressembler à ceci:

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

Il est sur quelque chose ici. –

+0

J'ai eu un problème similaire à celui-ci où je testais la méthode magique __destruct() en exécutant quelques fonctions simples, y compris la journalisation dans un fichier. Tout le code que j'ai placé dans ma méthode __destruct() s'exécutait quand l'objet sortait de sa portée sans appeler unset ($ var) mais PHP n'écrivait pas dans le fichier journal que je spécifiais à la place générant l'erreur d'autorisation décrite plus haut. Il exécuterait uniquement le code ET écrirait dans le fichier journal que j'ai spécifié si unset ($ var) était appelé. J'espère que ça aide quelqu'un. :-RÉ – dkcwd

0

Etes-vous sûr de recevoir cette "autorisation refusée" à chaque fois que ce fichier existe ou non? Quelle est la permission de dossier à laquelle ce fichier réside? Vous pouvez lui avoir donné un accès en lecture, mais pas exécuter par exemple.

0

Essayez d'utiliser file_put_contents() .... mais je belive qu'il publierait les mêmes mises en garde ...

0

-t-il vous donner l'avertissement quand vous le faites en dehors de __destruct? Ça pourrait être quelque chose à faire avec ça. Ou apache a des droits d'écriture mais pas lu?

Questions connexes