Beim Beenden file_put_contents()

  • Themenstarter Themenstarter misterbasti
  • Beginndatum Beginndatum
M

misterbasti

Hallo allerseits!
Ich bin auf ein ziemlich eigenartiges Problem mit der Funktion file_put_contents() gestoßen.

Es gibt ja die möglichkeit eine Shutdown-Funktion zu registrieren, die beim Beenden des PHP-Scripts aufgerufen wird. Ich nutze diese Funktion um ein paar Laufzeitinfos zu loggen.
Dazu verwende ich zum schreiben file_put_contents().

Das kleine Problem dabei ist, dass die Funktion pro Aufruf zwei statt einer erwarteten Zeile in die Datei schreibt. Gut okay, nachgesehen ob man versehendlich die Funktion zweimal aufruft oder ob die zu schreibenden Daten doppelt vorhanden sind.
Und da wurde ich stutzig.
Denn eben genau diese beiden Fehler habe ich nicht gemacht. Zum Test hab ich mir die Funktion folgendermaßen aufrufen lassen, um jeden Zweifel aus dem Weg zu räumen:
PHP:
echo file_put_contents('runtime.log', "zeile\n", FILE_APPEND) .'<br>';

Das Ergebnis war, dass mir die Anzahl der geschriebenen Bytes einmal ausgegeben wurden, was bedeutete, dass die Funktion wirklich nur einmal aufgerufen wurde. Aber dennoch wurden zwei Zeilen in die Datei geschrieben.

Kahm mir da etwas dumm vor, also hab ich ein Testscript geschrieben mit folgendem Inhalt.
PHP:
<?php
    function Shutdown(){
         echo file_put_contents('test.txt', 'zeile', FILE_APPEND) .'<br>';
    }

    register_shutdown_function('Shutdown');
?>

Und an der Stelle war ich dann völlig verwirrt.
Denn das Ergebnis war diesmal noch schöner, im Browser wurde mir fein eine Zeile mit der Anzahl der geschriebenen Bytes gezeigt.
Aber es wurde keine Datei geschrieben, es war keine da. O_O

In meiner Verwirrung den Entwicklungsserver neu gestartet -> das Problem blieb.

Nun ist das mit den zwei Zeilen für mein Projekt ja nicht wirklich ein Problem,
schreibt's halt zwei Zeilen, mir erst mal egal.
Aber die Frage ist, wieso sich die Funktion innerhalb des Shutdown-Handlers so verhält?
Von dem zweiten Beispiel mal ganz abgesehen. ._.
Und deswegen der Thread, ich hab nichts dazu bei Google gefunden, vielleicht weiß ja jemand von euch etwas Genaueres darüber?

Ich hab das ganze unter WAMPP und auf einem Linuxserver getestet, das Problem mit den zwei Zeilen blieb bei beiden Servern. Das zweite besipiel habe ich nur unter WAMPP getestet. Beide verwenden die PHP Version 5.3.8 .

Ich hoffe jemand weiß etwas darüber, ich bin mit meinem Latein am Ende.
:confused:
 
Zuletzt bearbeitet von einem Moderator:
In deiner "Shutdown" -Funktion rufst du

PHP:
file_put_content();

// statt
file_put_contents();

auf.
 
Ja, in diesem Beispiel habe ich mich vertippt. ;)
Aber beim test funktionierte es ja, sonst hätte es ja keine Ausgabe gegeben.

Die Frage bleibt dennoch...
 
Daran hatte ich auch gedacht, aber leider das gleiche Ergebnis, bei beiden Varianten.
 
Hi, du registrierst die Funktion auch nicht 2 mal oder so. Vielleicht auch mal den Namen der Funktion ändern da der sehr allgemein ist, eventuelle wird er durch ein anderes Ereignis aufgerufen?!

Aber ich würde dir empfehlen es im OOP Stil zu machen über den destructor.
 
Nein, sie wird weder zweimal registriert noch durch eine andere Funktion aufgerufen.
Der Code oben ist ja nur ein Beispiel bzw. Test.

Würde der Aufruf der Funktion doppelt erfolgen, würde ich auch zweimal eine Ausgabe mit den jeweilig geschrieben Bytes bekommen, das ist aber nicht der Fall.

Es wird nur einmal ausgegeben, was einen einzigen Funktionsaufruf bestätigt, dennoch werden zwei Zeilen geschrieben.
Es gibt auch keine andere Funktion, die in diese Datei schreibt, somit wäre diese Fehlerquelle auch ausgeschlossen.
 
Oh mann, ich hab's...

Also folgendes, ich habe die Funktion zum debuggen folgendermaßen registriert:
PHP:
function ShutdownHandler(){
    //some code...

    echo file_put_contents($Filename, $Data, FILE_APPEND) .'<br>';
}
//register...

Nun ist es nicht falsch zu meinen, die Funktion wäre nur einmal aufgerufen worden, wenn als Ergebnis nur eine Zeile mit der Anzahl der geschriebenen Bytes steht.
Das war auch der Fall, deswegen war ich fest davon überzeugt, dass die Funktion nur einmal aufgerufen wurde.

Das Problem hängt mit dem Template-System meiner Seite, bzw. mit dem Ausgabepuffer zusammen.

Es wird also ein Ausgabepuffer mit ob_start() gestartet und am Ende der Funktion entweder als String zurückgegeben oder direkt ausgegeben.
Wenn ich mir die Ausgabe zurückgeben lasse, wird nur eine Zeile geschrieben, die Rückgabe erfolgt über ob_get_clean().
Sobald ich jedoch direkt ausgeben lasse, also über ob_flush(), ob_end_flush(),
veranlasst dies PHP die Shutdown-Funktion aufzurufen.

Dabei geht die Ausgabe der Shutdown-Funktion irgendwie verloren, was mich zu dem Trugschluss führte, dass die Funktion nur einmal aufgerufen wird.
Fraglich wäre nun noch wieso die Ausgabe innerhalb oder beim Beenden des Puffers verloren geht.

Naja aber was soll's, Fehler meinerseits gefunden, Thema erledigt, vielleicht ist es für den ein oder anderen ja wissenswert. :)
 
Zurück