fwrite schreibt doppelt

  • der titel sagt schon alles
    ich möchte ein Log File schreiben

    PHP
    $file = fopen ('logs/'.$date.'.log', 'a');
    fwrite($file, $log);    
    fclose($file);

    eigentlich geht alles
    das Problem ist das nur das fwrite den Eintrag 2 mal schreibt
    ich hab viel ausprobiert zb. mit sleep(10); und hab dabei festgestellt
    das wirklich nur das fwrite Kommando doppelt läuft.

    wie schaffe ich das das Kommando nur einmal schreibt:?:

  • Wie sollen wir das bei dem Quellcode-Ausschnitt und den Infos beurteilen??? Fakt ist aber, dass PHP nicht von alleine alles doppelt reinschreibt.

    Richtig debuggen
    1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
    2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(E_ALL); und ini_set("display_errors", true);
    3. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
    4. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde (oder auch nicht).
    5. Schritt 3 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
    6. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
    7. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
    8. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.

  • ich hab es schon eingegrenzt und zwar auf diesen kleinen bereich
    deswegen ist es ja so merkwürdig

    als ich sleep(10); nach dem fwrite eingefügt habe hat er zuerst eine und nach 10 sekunden die andere zeile eigefügt.
    ich hab auch mein script duchsucht und mit einem counter überprüft ob es nich doppelt aufgerufen wird
    nichts... es muss an diesem befehl liegen
    ich hab auch mal gegoogelt und offenbar haben auch andere so ein ähnliches Problem.

  • Ich glaube immer noch, dass es an deinem Script liegt. Sollte es aber doch ein PHP-Bug sein, dann solltest du hier was zu finden: http://bugs.php.net/search.php

    Wenn es an PHP liegt, müsstest du hier auch den Text doppelt in der Datei haben:

    PHP
    <?php
       $text = "Dies ist ein Text\n";
     
       $file = fopen ('test.log', 'a+');
       fwrite($file, $text);    
       fclose($file);  
    ?>

    2 Mal editiert, zuletzt von bandit600 (15. Oktober 2008 um 22:12)

  • du kannst dir gerne den rest meines Scripts ansehen
    $error ist "/testfehler"

    das ist der gesamte teil des Codes der den roten Balken
    in dem die Fehler stehen schreibt und die log Datei erstellt
    der Inhalt des Logs ist wie folgt:

    Code
    thu 15.10.2008 22:25.38 - testfehler
    thu 15.10.2008 22:25.38 - testfehler

    mehr infos hab ich nicht
    siehst du einen Fehler?

  • Zitat

    du kannst dir gerne den rest meines Scripts ansehen

    Zitat

    das ist der gesamte teil des Codes


    Also wieder nicht das komplette Script.

    Hast du nachgesehen, ob das ein bekannter PHP-Bug sein könnte? Hast du mein kleiner Testscript ausprobiert? Du hast "Richtig debuggen" nicht umgesetzt.

    Du hast ein Problem, also bemühe du dich, um solche Dinge hier nicht offen zu lassen. Solange das nicht alles geklärt ist, verabschiede ich mich aus diesem Thread.

  • OHA... mumpitz²

    jaja bandit ^^,
    ich nehme alles zurück,...

    Ist das das was du willst?
    Du solltest dich unbedingt mal mit foreach Schleifen auseinandersetzen ^^

    Gruß crAzywuLf :D

    4 Mal editiert, zuletzt von crAzywuLf (16. Oktober 2008 um 13:32)

  • Den Modus "ab" gibt es nicht! Vielleicht solltest du den richtigen für dich auswählen


    Aus der Doku:

    Zitat

    Hinweis: Zusätzlich kann mode der Buchstabe 'b' hinzugefügt werden, der die Behandlung von Binärdateien erlaubt. Dies ist nur auf Systemen sinnvoll, welche zwischen Binär- und Text-Dateien unterscheiden (z.B. Windows. Ist bei Unix sinnlos). Wenn das Feature nicht gebraucht wird, wird es einfach ignoriert. Sie sollten den 'b' Flag verwenden, um Ihre Skripte portabler zu machen.

    :D:-);-)

  • ok ich hab wirklich noch nie mit foreach gearbeitet, aber der sinn ist nicht mehr der selbe.
    das script sollte bei gesetzter $error einen eintrag machen
    bei einem fehler so:
    (datum) - (fehler)
    bei zwei fehlern so:
    (datum) - (fehler) & (fehler2)
    bei dem script unten würde er 2 einträge mit dem selben datum schreiben.
    das war nicht der sinn

    @bandit600:
    ich fühl mich dabei unwohl alles hier rein zu stellen
    den das ist arbeit von mehr als ein monat und ich will nicht das man das mir klaut:?
    außerdem arbeitet dieser teil des scripts unabhängig und wird nur so ins hauptscript importiert.
    dein testscript hab ich gemacht und es lief wunderbar, auch im "a" modus (ohne +)
    der fehler steht auch nicht in der buglist.

  • ich will nicht das man das mir klaut


    Ohhhhhh, du schreibst auch bestimmt ein Script, auf das sich jeder sofort stürzen und kopieren wird (ganz besonders bei dem Quellcode). :(
    Dann bleiben aber immer noch 2 offene Punkte. Ich würde mal sagen, da wir hier nur Teilinformationen kennen, wirst du den Fehler alleine suchen müssen.

  • so besser?

    Gruß crAzywuLf :D

  • Wenn bandit schriftlich austickt, sieht das anders aus


    Vielen Danke Herr Von und Zu. Ich ticke doch hier nie aus, sondern ich drücke mich nur unmissverständlich aus. ;)

  • Schau doch einfach einmal, ob das Script mehrmals includet wird, das würde es erklären.
    Eine Sache mit der Ausgabe von Fehlern:
    Was Bandit meinte, mit einfach ausgeben, macht die Ausgabe sehr unübersichtlich und der FF meckert über XML-Parse-Error.
    Crazywulfs Script ist etwas aufwendig und braucht viel Zeit, um es wieder zu entfernen.
    Deshalb gibt es FirePHP, in PHP rufst du die Funktion fb('blabla', [Typ wie Error, Warning, dump, etc.]) auf und im Firefox-Addon siehst du die eine übersichtliche Ausgabe, gibt auch Tabellen (einfach mehrere Arrays hintereinander) und die Ausgabe von Objekten, der Quellcode bleibt unberührt.

    Achso Bandit: Das ist ja alles ganz schön mit der Doku und den Debug-Verfahren, aber manchmal kann man auch einfach mal fragen, weil einen das Problem schon lang genug genervt hat und auch noch eine Stunde davor hocken könnte. ;)

    Viele liebe Grüße
    The User