Felix Riesterer: fputs schreibt nix... verstehe die Welt nimmer!

Beitrag lesen

Liebe PHP-Fachleute,

ich habe mir ein Script geschrieben, das eigentlich zweimal dasselbe tut. Aber einmal erreiche ich den gewünschten Effekt _nicht_, obwohl das Vorgehen in beiden Fällen identisch ist. Das Error-Log (E_ALL) schweigt stille...

Ich definiere zwei Funktionen, die jeweils dasselbe tun:
1. Einen XML-String erzeugen
2. XML-Datei zum Schreiben öffnen
3. XML-String in diese Datei schreiben (versagt bei einer Funktion aus unerklärlichen Gründen!!!)
4. XML-Datei schließen
5. Ende der Funktion

Hier mein Code:

// speichere alle Bilder  
function speichere_alle_bilder() {  
    // alte XML-Datei holen und XML-Inhalte löschen (standalone-DTD erhalten)  
    $xml = preg_replace('~^(?is)(.*<AlleBilder>[\r\n]+).*(</AlleBilder.*)$~', '\\1\\2', implode('', file($_SERVER['pg-cms']['datendatei']['alle-bilder'])));  
    $xml_bilder = '';  
    foreach ($_SERVER['pg-cms']['alle-bilder'] as $datei) {  
        $xml_bilder .= "\t<Bild ";  
        $xml_bilder .= 'URL="'.$datei['url'].'" ';  
        $xml_bilder .= 'Groesse="'.$datei['groesse'].'" ';  
        $xml_bilder .= 'Abmessungen="'.$datei['abmessungen'].'" ';  
        if ($datei['geschuetzt'] == 'ja')  
            $xml_bilder .= 'Geschuetzt="ja" ';  
        $xml_bilder .= "/>\r\n";  
    }  
  
    $xml = preg_replace('~(?is)(</AlleBilder.*)$~', $xml_bilder.'\\1', $xml);  
  
    $datei = fopen($_SERVER['pg-cms']['datendatei']['alle-bilder'], 'wb+');  
    fputs($datei, $xml); // Schreibvorgang scheint nicht ausgeführt zu werden!!! $xml ist definitv _kein_ Leerstring!  
    // weitere fputs-Anweisungen hier bewirken auch keine Befüllung der Datei  
    fclose($datei);  
}  
  
  
// speichere alle HTML-Dateien  
function speichere_alle_html_dateien() {  
    // alte XML-Datei holen und XML-Inhalte löschen (standalone-DTD erhalten)  
    $xml = preg_replace('~^(?is)(.*<AlleSeiten>[\r\n]+).*(</AlleSeiten.*)$~', '\\1\\2', implode('', file($_SERVER['pg-cms']['datendatei']['alle-html-dateien'])));  
    $xml_neu = '';  
    foreach ($_SERVER['pg-cms']['alle-html-dateien'] as $key => $value) {  
        $xml_neu .= "\t".'<Seite URL="'.$key;  
        $xml_neu .= '" Modified="'.$value['modified'].'">'."\r\n";  
        $xml_neu .= "\t\t<Titel><![CDATA[";  
        $xml_neu .= html_entity_decode($value['titel']);  
        $xml_neu .= "]]></Titel>\r\n\t</Seite>\r\n";  
    }  
  
    $xml = preg_replace('~(?is)(</AlleSeiten.*)$~', $xml_neu.'\\1', $xml);  
  
    $datei = fopen($_SERVER['pg-cms']['datendatei']['alle-html-dateien'], 'wb+');  
    fputs($datei, $xml);  
    fclose($datei);  
}

Es ist mir völlig unerklärlich, warum die Funktion "speichere_alle_html_dateien" erfolgreich ihren XML-Code in die geöffnete Datei schreiben kann, während bei der Funktion "speichere_alle_bilder" die XML-Datei eine leere (0 Bytes) Datei bleibt. Offensichtlich wird die Funktion fputs nicht korrekt ausgeführt (der XML-String ist korrekt erzeugt worden und vorhanden!).

Das Problem trat bei mir auf zweierlei Windoof-Kisten, als auch unter einer SuSE mit jeweils einem Apachen2 und PHP5 auf (genauere Versionen: win32 apache2.2.3 PHP5.1.6, SuSE10.0 Apache+PHP wie mitgeliefert(?)). Dateirechte können auch nicht das Problem erklären, denn unter SuSE stehen alle auf 0777. Ich versteh's einfach nicht. o_O

Wer weiß Rat?

Liebe Grüße aus Ellwangen,

Felix Riesterer.