Ben: Datei in Session

Hallo zusammen

Ich möchte gerne eure Meinung zu folgendem hören:

Ich habe einen Fileupload, welcher mehrere Schritte beinhaltet. Erster Schritt, Upload der Datei, zweiter Schritt, anhand der Dateiinfos weitere Angaben.

Damit ich mir nun das zwischenspeichern der Datei auf im Filesystem sparen kann, habe ich mir überlegt, die Datei nach dem Upload vom Temp-Verzeichnis mit file_get_contents in eine Session-Variable abzulegen, bis alle Upload-Schritte erfolgreich waren.

So könnte ich mir die Probleme mit "Geisterdateien" nach abgebrochenen Uploads sparen, da ja die Sessions nach einem bestimmten Zeitraum automatisch gelöscht werden.

Haltet ihr das für eine Schnapsidee? Und gibt es Beschränkungen für die Grösse einer Session, bzw. deren Variablen?

Danke für eure Meinung & Gruss
Ben

  1. Lieber Ben,

    Damit ich mir nun das zwischenspeichern der Datei auf im Filesystem sparen kann, habe ich mir überlegt, die Datei nach dem Upload vom Temp-Verzeichnis mit file_get_contents in eine Session-Variable abzulegen, bis alle Upload-Schritte erfolgreich waren.

    ich könnte mir vorstellen, dass Du Probleme mit Deinem zur Verfügung stehenden Arbeitsspeicher bekommen kannst - je nach Größe der hochgeladenen Datei.

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hi

      Also so wie ich das Konzept von Sessions verstanden habe werden die Sessions als Cookies abgespeichert. Was du also machen würdest wäre, dass du zuerst die Datei auf deinen Server ziehst, sie dann wieder zurückschickst und später nochmal hochlädst. Dadurch würde das Script definitiv ziemlich verlangsamt werden.

      In jedem Fall wird ne ganze Menge Speicher verschenkt, da speicherst du lieber die Dateien als "Geisterdateien" und schaust einmal am Tag per CronJob drüber.

      Gruß
      Moe

      1. Hallo Moe

        Das mit den Sessions in den Cookies ist so nicht richtig. Die Session-Daten werden auf dem Server gespeichert. Im Client-Cookie wird lediglich die Session-ID gespeichert und dann immer wieder mitgeschickt, damit der Server weiss welche Session die richtige ist.

        Und zum ersten Antwortpost: Ist es wirklich so, dass alle Session-Daten im Arbeitsspeicher bleiben? Ich habe gedacht, die werden normal in ein Session-Verzeichnis gespeichert. Die Frage wäre dann nur, ob beim erneuten Starten der Session alle Session-Daten in den Arbeitsspeicher geladen werden oder nur bei Gebrauch der einzelnen Variablen.

        Weiss das jemand genau?

        Gruss Ben

        1. hi,

          Und zum ersten Antwortpost: Ist es wirklich so, dass alle Session-Daten im Arbeitsspeicher bleiben?

          Nein, _bleiben_ nicht.
          Aber während der Scriptlaufzeit stehen sie natürlich im Arbeitsspeicher.

          Ich habe gedacht, die werden normal in ein Session-Verzeichnis gespeichert. Die Frage wäre dann nur, ob beim erneuten Starten der Session alle Session-Daten in den Arbeitsspeicher geladen werden

          Ja.

          oder nur bei Gebrauch der einzelnen Variablen.

          Nein.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. Danke für eure Antworten.

            Es war also doch keine so gute Idee. :-)

            Das mit dem Cronjob wäre an sich eine gute Sache, jedoch kann man das leider nicht bei jedem Hoster einrichten, und meine Scripts sollten möglichst überall lauffähig sein. Aber ein "Garbage Collector" direkt im Upload-Script ist wahrscheinlich die beste Lösung, auch wenn die Performance leicht darunter leiden könnte.

            Gruss Ben

            1. Das mit dem Cronjob wäre an sich eine gute Sache, jedoch kann man das leider nicht bei jedem Hoster einrichten,

              www.cronjob.de

      2. Also so wie ich das Konzept von Sessions verstanden habe werden die Sessions als Cookies abgespeichert.

        Nur teilweise korrekt. Das, was als Cookie abgespeichert wird, ist nur der Schlüssel zur Session, die sogenannte Session-ID.

        Was du also machen würdest wäre, dass du zuerst die Datei auf deinen Server ziehst, sie dann wieder zurückschickst und später nochmal hochlädst.

        Nein, die Datei würde nur einmal hochgeladen werden und dann auf dem Server verbleiben. Es wird ja nur ein Cookie mit der Session-ID gesetzt, nicht mit dem Inhalt der Session.

        In jedem Fall wird ne ganze Menge Speicher verschenkt, da speicherst du lieber die Dateien als "Geisterdateien" und schaust einmal am Tag per CronJob drüber.

        Soviel ich weiß, wird die Session ja standardmäßig in eine eigene Datei gespeichert. Ob nun die hochgeladene Datei zusammen mit anderen Variablen in einer Datei abgelegt wird oder einfach so beim Server gespeichert wird, wie sie vom Client kommt, wird von Speicher her ziemlich egal. Das Problem ist nur, dass bei der ersten Methode beim Inportieren der Session auch automatisch die Datei importiert wird, was womöglich unnötig ist und Arbeitsspeicher verbraucht.

        mfg
        Rato

        --
        §§§
        Meine Postings basieren lediglich auf mein Wissen und können völliger Blödsinn sein.
        §§§
  2. Hello Ben,

    Wenn Du einen Fileupload über HTTP vornimmst und ihn von PHP bearbeiten lässt, dann legt das PHP-System ein "php-temporäres" File auf dem Fileserver im in der INI (oder an anderer Stelle) festgelegten Stelle an.

    Wenn das Cript endet, wird sie automatisch gelöscht. Das funktioniert so sehr gut, dass ich bei einem "CMS", das ca. vier Jahre durchgehend lief, keine einzige vagabundierende Datei bekommen habe.

    Nach dem Upload einer Datei solltest Du als erstes

    $_FILES[$user_upload_field_name]['error']

    überprüfen.

    Wenn ['error'] === 0 ist, wurde genau ein File ordnungsgemäß hochgeladen
    Wenn ['error'] ein Array ist, wurden mehrere Files hochgeladen. Dann musst Du die Prüfungen mit allen

    $_FILES[$user_upload_field_name]['error'][$n]

    vornehmen.

    Weiterhin solltest Du den MIME-Type der Datei prüfen lassen, und zwar bitte von einer geeigneten Funktion auf dem Server, und _NICHT_ einfach durch Nachsehen in

    $_FILES[$user_upload_field_name]['type']
    oder
      $_FILES[$user_upload_field_name]['type'][$n]

    Dort steht nur der vom Client mitgelieferte MIME-Type-Bezeichner drin, und der kann nach belieben gefälscht sein. Geeignet ist die Funktion

    http://www.php.net/manual/de/function.mime-content-type.php

    oder die in der Beschreibung bezeichnete Nachfolgelösung.

    BTW: Mir ist immer noch schleihaft, warum die PHP-Entwickler eine derartig wichtige Funktion noch nicht "repariert" haben und fest in den Sprachbestand aufgenommen haben.
    Hier handelt es sich um die häufigste Sicherheitslücke, die es in PHP-Systemen gibt, wenn der MIMIE-Type von uploaded Files nicht überprüft wird.

    Alternativ kannst Du auch

    http://www.php.net/manual/de/function.getimagesize.php

    und seine Brüder benutzen, wenn es um die Überprüfung von Bilduploads geht.

    Weitere Hinweise unter

    http://www.php.net/manual/de/features.file-upload.php

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. hi,

      Wenn das Cript endet, wird sie automatisch gelöscht. Das funktioniert so sehr gut, dass ich bei einem "CMS", das ca. vier Jahre durchgehend lief, keine einzige vagabundierende Datei bekommen habe.

      Wenn die Verarbeitung in der selben Scriptinstanz stattfindet, klar.

      Aber hier geht es ja darum, dass die Datei wohl erst in einem nachgelagerten Script (zweite Formularseite) endgültig akzeptiert werden soll.
      Wenn in Script #1 ein Upload stattfindet, der dann erst woanders hin gesichert wird, und dann Script #2 nicht mehr bedient wird - _dann_ gibt es in diesem Szenario eine Dateileiche, um die sich anschliessend noch irgendwer kümmern sollte.

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      1. Hello,

        Aber hier geht es ja darum, dass die Datei wohl erst in einem nachgelagerten Script (zweite Formularseite) endgültig akzeptiert werden soll.

        Ach, das hatte ich anders verstanden.

        Nun gut, dann muss tatsächlich eine Session-basierte Lösung her.
        Das Problem ist dann der fruchtlose Verlauf der Session, nicht das ordnungsgemäße Ende.

        Hierfür würde man also einen zusätzlichen Aufräumdienst benötigen, der nicht nur die Daten der der abgelaufenen Session wegräumt, sondern auch die durch in ihr duech Handles referenzierten Daten/Files.

        Da bleibt eigentlich nur die gute alte Batch-Verarbeitung und das Anlegen eines "Zwischenverzeichnisses", in dem die nicht verifizierten Files abgelegt werden z.B. unter der Sessionnummer (Unterverzeischnis). Wenn dann das große Löschtool läuft, und kann die Sessiondatei nicht mehr finden, darf es das Unterverzeichnis mit dem Namen der verschwundenen Session löschen.

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

  3. hi,

    Damit ich mir nun das zwischenspeichern der Datei auf im Filesystem sparen kann, habe ich mir überlegt, die Datei nach dem Upload vom Temp-Verzeichnis mit file_get_contents in eine Session-Variable abzulegen, bis alle Upload-Schritte erfolgreich waren.

    Keine gute Idee - massiv erhöhter Arbeitsspeicher-"Verbrauch".

    Haltet ihr das für eine Schnapsidee?

    Ja.

    Und gibt es Beschränkungen für die Grösse einer Session, bzw. deren Variablen?

    $_SESSION ist eigentlich eine "stinknormale" Variable.
    Und die teilt sich mit allen anderen, und dem was dein Script sonst noch so an Speicher belegt, das, was memory_limit hergibt.

    So könnte ich mir die Probleme mit "Geisterdateien" nach abgebrochenen Uploads sparen, da ja die Sessions nach einem bestimmten Zeitraum automatisch gelöscht werden.

    Die kann man ja auch selber löschen - bspw. mit einem per Cronjob einmal täglich gestarteten Script, welches alle Dateien älter als X wegputzt.

    Alternativ könnte man auch die hochgeladenen Dateien erst mal ins Session-Temp-Verzeichnis "sichern" - in der Hoffung, dass der Garbage Collector des Session-Mechanismus dann nach Ablauf von session.max_lifetime in Bezug auf ihren Timestamp sie ebenfalls mit wegputzt ...
    Da bin ich mir allerdings nicht ganz sicher, ob und wie das funktionieren würde; ob man bestimmte Dateinamen wählen müsste (die Session-Dateien "ähnlich" sehen) - und es erscheint mir auch ein wenig zu "verwegen"; wäre bspw. nicht auszuschliessen, dass sich dass dann auf die Performance der Sessions allgemein auswirkt, wenn in deren Verzeichnis wirklich große Dateien rumlungern.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }