In PHP erstellte Daten gehen verloren

  • Hallo Community!


    ich habe mir ein kompaktes, 245 zeilen langes PHP-skript geschrieben, welches mir als kleines Forum dienen soll.
    Um den Schreib-Puffer nutzen zu können, habe ich keine MySQL-Datenbank verwendet, sondern schreibe alles in zwei text-dateien, die ich mit *.ddb bezeichnet habe.


    die einträge des Forums werden folgendermaßen geschrieben:

    Code
    function eintrag_erstellen ( $name , $datum , $topic , $eintrag ) {
        $fp = fopen ( "eintraege.ddb" , "a" );
        fwrite ( $fp , "\n" . $name );
        fwrite ( $fp , "\n" . $datum );
        fwrite ( $fp , "\n" . $topic );
        fwrite ( $fp , "\n" . $eintrag );
        fwrite( $fp , "\n<!--endofentry-->" );
        fclose ($fp);
        return NULL;
    }



    mein Problem ist jetzt dieses:
    nach 3 bis 5 Minuten geht der erstellte eintrag verloren, wenn ich während dem Erstellen viel Festplatten-Zugriff habe. Wenn ich kein Platten-zugriff habe, wird der eintrag erst gelöscht, wenn wieder ein externer Plattenzugriff besteht.


    Kennt einer dieses Phänomen? Und wie kann man das vermeiden?
    Ich habe eine TS-109pro mit FW v.3.3.0 , MySQL ausgeschaltet um den Schreib-Puffer einschalten zu können. Weiter Tools sind nur Optware und OpenVPN installiert. Sonst ist das Gerät soweit im Grundzustand.


    Gruß Flo

  • Hi Flo,


    weshalb nutzt du keine der vielen am Markt und für Lau verfügbaren Forensoftware die auch mit einer ordentlich DB Struktur daher kommen?
    Du musst das Rad doch nicht neu erfinden ;)


    Mfg
    Christian

  • Warum willst du unbedingt den Schreibpuffer nutzen?

  • Hallo Leute!


    Ich nutze keine Forensoftware, da diese wieder auf MySQL-Datenbanken zugreifen möchte, wie zum Beispiel Burning Board, was ich schon mal angetestet habe. Desweiteren müsste ich für viele Foren einen Mail-Server einrichten, dies ist mir zu umständlich und ich brauche es eigetlich überhaupt nicht. Ich nuzte auch keine umfangreiche Forensoftware, wenn ich für eine Community von etwa 10 -20 leute eine news-seite brauche, in der die nachrichten in 3 topics eingeteilt werden (siehe oben $topic).


    ich möchte den Schreibpuffer verwenden, da ich damit von 11MB/s auf 20MB/s lesegeschwindigkeit steigere und von 10MB/s auf 16MB/s Schreibgeschwindigkeit komme.


    Ich möchte noch anmerken:
    - ich bin im PHP und MySQL ziemlich bewandert
    - ich habe mich in den vergangenen Tagen extrem mit meiner QNAP auseinander gesetzt
    - in sachen Netzwerk kenne ich mich eigentlich ausreichend aus, mir fehlt als student nur das Budget für die Hardware


    Nochmal zurück zur eigentlichen Frage:
    Kennt jemand das Phänomen, dass sich daten, die ich mit einem PHP-Skript auf die Platte schreibe, in Wohlgefallen auflösen?
    kann das vieleicht an dem Schreibpuffer liegen?
    oder hat der PHP-Prozessor nicht die richtigen rechte?
    gibt es irgendetwas, das ich nicht bedacht haben könnte, aber wichtig ist?

  • Hi,


    schaue Dir mal fflush, ob_start, ob_end_flush in der php doc an, wenn Du es so umbedingt machen möchtest. Es bringt aber nix an performance. (darum hab ich Dir auch mal ob_start empfohlen - ist vielleicht auch interessant für Dich).
    Danach solltest auf jeden fall noch mit einem Errorhandling anfangen.


    Wenn Dir mysql zu gross für was kleines ist, dann schaue mal in die Richtung XML (auch in der php doku). Das lässt sich schneller parsen als Plaintext. Alternativ könntest Du dir auch mal die php sqlite Funktionen angucken.
    Zu sehr brauchst Du dich wegen der Performance auch net anstrengen, Textdaten / auch XML sind halt immer langsamer als wenn auch beispielsweise kleine DB's wie SQLite und werden ziemlich gross (darum wurden damals Komprimierungsanwendungen entwickelt).


    Grüsse, David

  • hab den fflush-befehl noch eingefügt, wobei dieser keinen sinn macht, da ich anschliesend mit dem befehl fclose automatisch den puffer leere.
    diese veränderung im skript hatte das problem nicht behoben.


    was mir ob_start bei meinem problem helfen soll, ist mir noch unschlüssig, da ich daten in eine datei schreiben will, und nicht dem browser des besuchers übermitteln möchte.


    ich werde mich auch mal in xml und SQlite einlesen, vieleicht bringt mich das weiter.


    ich weiß, dass es einfacher ist, alles in eine MySQL-Datenbank zu schmeißen. So hab ich es auch mit dem Vorgänger des aktuellen php-skripts gemacht. Aber um mehr Festplatten-leistung zu bekommen, distanziere ich mich jetzt davon.
    ich erinnere mich an andere Foren-einträge: die Qnap ist und bleibt eine Speicherlösung, trotz der vielen tools, die es unterstützt.


    zu meinem eigentlichen Problem nochmal:
    ich habe eher das gefühl, das etwas mit den Rechten nicht passt, oder der schreibpuffer einen einfluss hat. Denn wenn ich die datei "eintraege.ddb" auf meinem Tower über Samba öffne, steht der erstellte Eintrag drin, solange er auch auf der webseite zu sehen ist. wenn der eintrag auf der webseite wieder verschwunden ist, ist auch die entsprechende datei wieder zurückgesetzt.
    daraus schließe ich, dass mein skript definitiv geht, denn die daten werden ja offensichtlich gespeichert und auch richtig ausgelesen.


    ich werde heut abend mal mit den rechten experimentieren, vieleicht bekomme ich dadurch neue ergebnisse.
    wenn ihr aber noch andere ideen habt, wäre ich euch sehr dankbar.

  • in der tat war es ein problem mit den Rechten.


    da ich die Qweb-Freigabe nur für administratoren freigegeben hatte, durfte der PHP-Parser nicht schreiben, da dieser nur guest-rechte besitzt. wieso er dann die php-datei lesen konnte und warum die änderungen der datei erst später verloren gingen, ist mir weiterhin schleierhaft.


    jetzt hab ich keine schreib-einschränkungen und alles funktioniert. Sicherheit ist jetzt aber keine mehr gegeben...