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.