Sabine: Dateizugriff erfassen

Hallo,
ich biete auf meiner Seite ein ZIP-File zum Download an und möchte zum Aktualisieren dieses ZIP-Files den Download kurzzeitig sperren können. Das ist eigentlich auch kein Problem.
Kann ich aber auch feststellen, ob just in einem Moment gerade ein User das File runterlädt?
Wäre ja schlecht, wenn ich in dem Moment versuche das File upzudaten.

Gruß
Sabine

  1. Hallo,

    ich biete auf meiner Seite ein ZIP-File zum Download an und möchte zum Aktualisieren dieses ZIP-Files den Download kurzzeitig sperren können. Das ist eigentlich auch kein Problem.
    Kann ich aber auch feststellen, ob just in einem Moment gerade ein User das File runterlädt?
    Wäre ja schlecht, wenn ich in dem Moment versuche das File upzudaten.

    steht im LogFile Deines Servers.
    Mit Php hat das Ganze nicht sehr viel zu tun.

    Gruß
    Reiner

    1. Mit Php hat das Ganze nicht sehr viel zu tun.

      Ich glaube Sabine sucht eine Möglichkeit festzustellen, ob jemand z.Z. das File runterlädt, um nicht in dem Moment einen Upload durchzuführen.
      Das würde mich auch interessieren, ob man das mit PHP abfragen kann.

      Timo

      1. Hello,

        Ich glaube Sabine sucht eine Möglichkeit festzustellen, ob jemand z.Z. das File runterlädt, um nicht in dem Moment einen Upload durchzuführen.
        Das würde mich auch interessieren, ob man das mit PHP abfragen kann.

        Man kann

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

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
      2. HallO!

        Ich glaube Sabine sucht eine Möglichkeit festzustellen, ob jemand z.Z. das File runterlädt, um nicht in dem Moment einen Upload durchzuführen.
        Das würde mich auch interessieren, ob man das mit PHP abfragen kann.

        Der Download wird durch ein PHP-Script (Download-Script) gestartet. der eigentliche Ort der ZIP-Datei ist dem User nicht bekannt, sondern das PHP-Script holt die ZIP-Datei.

        In das Script baut man eine Sperre (An/Aus) ein.

        Wenn noch ein Download läuft, kann Sie das Script sperren, weil das Script den Download schon längst angestoßen hat bzw. damit gar nichts mehr zu tun hat.

        MfG, André Laugks

      3. Moin!

        Mit Php hat das Ganze nicht sehr viel zu tun.
        Ich glaube Sabine sucht eine Möglichkeit festzustellen, ob jemand z.Z. das File runterlädt, um nicht in dem Moment einen Upload durchzuführen.
        Das würde mich auch interessieren, ob man das mit PHP abfragen kann.

        Das ist gar nicht notwendig, es mit PHP abzufragen.

        Alle mir bekannten FTP-Programme (die Server) arbeiten so, dass die hochgeladenen Daten zunächst in eine temporäre Datei geschrieben werden. Das alte ZIP bleibt also zunächst unverändert bestehen und kann in dieser Zeit auch noch komplett heruntergeladen werden. Erst nach Abschluss des Uploads wird die temporäre Datei an die Stelle des alten Originals verschoben - allerdings nur im Inhaltsverzeichnis, nicht komplett auf der Festplatte. Diese Operation ist atomar, sie kann nicht durch anderweitige Aktivitäten unterbrochen werden. Und ich bin mir auch ziemlich sicher, dass das Betriebssystem es geregelt kriegt, dass vor der Verschiebung angefangene Downloads noch komplett die alte Datei kriegen (die Daten sind ja noch auf der Festplatte gespeichert, die Position der Datei ist den bereits offenen Dateideskriptoren bekannt und kann bis zum Ende verfolgt werden). Downloads nach der Verschiebung kriegen in jedem Fall die komplett neue Datei.

        - Sven Rautenberg

        1. Hello,

          Das ist gar nicht notwendig, es mit PHP abzufragen.

          Alle mir bekannten FTP-Programme (die Server) arbeiten so, dass die hochgeladenen Daten zunächst in eine temporäre Datei geschrieben werden. Das alte ZIP bleibt also zunächst unverändert bestehen und kann in dieser Zeit auch noch komplett heruntergeladen werden. Erst nach Abschluss des Uploads wird die temporäre Datei an die Stelle des alten Originals verschoben - allerdings nur im Inhaltsverzeichnis, nicht komplett auf der Festplatte. Diese Operation ist atomar, sie kann nicht durch anderweitige Aktivitäten unterbrochen werden. Und ich bin mir auch ziemlich sicher, dass das Betriebssystem es geregelt kriegt, dass vor der Verschiebung angefangene Downloads noch komplett die alte Datei kriegen (die Daten sind ja noch auf der Festplatte gespeichert, die Position der Datei ist den bereits offenen Dateideskriptoren bekannt und kann bis zum Ende verfolgt werden). Downloads nach der Verschiebung kriegen in jedem Fall die komplett neue Datei.

          Eine Umbenennung einer durch andere Prozesse benutzten Datei ist aber nicht die feine Art. Die Programme müssten also Locking betreiben, was sie aber aufgrund der meistens nicht für Mandatory Locking mounted Filessystems nicht wirlich können.

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

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          1. Moin!

            Eine Umbenennung einer durch andere Prozesse benutzten Datei ist aber nicht die feine Art.

            Doch. Atomare Dateioperationen sind erstens absolut legitim und zweitens werden sie regulär von diversen Programmen genau dafür genutzt, sich nicht mit komplexen Locking-Problemen, Semaphoren etc. herumschlagen zu müssen, und es funktioniert bestens.

            - Sven Rautenberg

            1. Hello,

              Eine Umbenennung einer durch andere Prozesse benutzten Datei ist aber nicht die feine Art.

              Doch. Atomare Dateioperationen sind erstens absolut legitim und zweitens werden sie regulär von diversen Programmen genau dafür genutzt, sich nicht mit komplexen Locking-Problemen, Semaphoren etc. herumschlagen zu müssen, und es funktioniert bestens.

              Ich kann mir allerdings nicht vorstellen, wie das funktionieren soll.

              Ich gehe mal vom Intel-Konzept und einem darauf laufenden OS aus:

              Datei 1 wird vom Webserver gelesen
              Datei 2 wird auf den Server hochgeladen
              Datei 2 wird in Datei 1 umbenannt. Das ist mit bei vernünftigen OS mit den Handlefunktionen nicht mehr möglich, sondern nur mit mit den alten FCB-Funktionen.
              Also muss erst Datei 1 umbenannt werden
              Erst dann kann Datei 2 den Namen von Datei 1 annehmen.
              Und welcher Prozess achtet jetzt darauf, wann Datei 1 gelöscht werden kann?

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

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
              1. Moin,

                Und welcher Prozess achtet jetzt darauf, wann Datei 1 gelöscht werden kann?

                Die Antwort ist einfach: Auf modernen Betriebssystemen sind Namen und Dateien zwei völlig verschiedene Dinge. Dateien werden über Inodes (o.ä.) angesprochen, die Namen stehen nur in einem Verzeichnis und bilden Zeiger auf die Inodes. So kann eine Datei auch beliebig viele Namen haben (Hard links).

                Die andere Sache ist die, dass beim Öffnen einer Datei einmal der Name vom Prozess angegeben wird, vom Betriebssystem kriegt er dann ein Filehandle, eine Nummer. Die Datei wird danach nur noch über die Nummer angesprochen. (_Eigentlich_ gibt es nichtmal mehr eine Möglichkeit vom Handle auf den Namen zu schließen der mit der Datei verknüpft ist.) Der Name ist für eine offene Datei vollkommen unerheblich. Du kannst mit ihm machen was du willst: du kannst ihn umbenennen, und sogar löschen.

                In den Datenstrukturen der Datei wird dabei ein Referenzzähler geführt, der angibt wieviele Namen noch auf diese Datei zeigen. Und sobald der Zähler auf Null geht (und die Datei geschlossen ist) wird der von ihr belegte Speicherplatz wieder freigegeben.

                Das ganze läuft also so ab: Prozess A öffnet die Datei über einen Namen X, kriegt ein Handle. Er liest dann mit diesem Handle aus der Datei. Der Name ist jetzt nicht mehr von Bedeutung. Prozess B lädt eine Datei hoch und nennt sie Y. Wenn er fertig ist löscht er den alten Namen X - der Referenzzähler geht auf Null, aber die Datei ist ja noch offen - und legt für Y einen neuen Namen an, er nennt sie X. Y kann jetzt gelöscht werden, der Referenzzähler bleibt auf 1. Prozess B ist jetzt fertig, und Prozess A kann immer noch lustig aus seinem Handle lesen. Sobald er fertig ist schliesst er die Datei und das Betriebssystem gibt den Speicherplatz frei.

                Der interessante Prozess - das Löschen von X und anschließende Umbenennen von Y nach X - geschieht atomar: Das heisst, es gibt keinen Augenblick indem X nicht mehr existiert und Y noch nicht umbenannt wurde. Ein Prozess der direkt davor X öffnet kriegt noch ein Handle auf die alte Datei, direkt danach würde er ein Handle auf die neue Datei kriegen.

                PS: Das alles ist jetzt prinzipiell und "so sollte es sein". Mir ist durchaus bewusst dass Windows zum Beispiel künstliche Einschränkungen hat die es nicht erlauben eine Datei umzubenennen während sie noch geöffnet ist.

                --
                Henryk Plötz
                Grüße aus Berlin
                ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
                ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~
                1. Hello Henryk,

                  Und welcher Prozess achtet jetzt darauf, wann Datei 1 gelöscht werden kann?

                  Danke für die ausführliche Erklärung. Die Sache mit den Handles und wie es funktionieren könnte, war mir schon klar. Allerdings war ich mir sicher, dass bei WinDOS die Dateien nicht umbenannt werden können, solange sie in Benutzung sind. Und so ist es auch.

                  Auf Linux habe ich es nun selbst ausprobiert. Man kann sogar noch in die verlorene Datei hineinschreiben und wieder daraus lesen, solange man das Handle darauf hält. Nach dem Schließen  ist sie weg.

                  Unter Windows: Datei mit Word öffnen und dann versuchen, sie umzubenennen. Da die Datei gesperrt ist (DOS Openmode 2/0), kann sie nicht umbenannt werden. Mit einfachen Editoren kann man das nicht testen, da die die Datei einlesen (in eine Temp-Datei kopieren) und sofort wieder freigeben.
                  Ich wollte nicht erst was programmieren. :-)

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

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau
    2. Hello lieber Reiner,

      ich biete auf meiner Seite ein ZIP-File zum Download an und möchte zum Aktualisieren dieses ZIP-Files den Download kurzzeitig sperren können. Das ist eigentlich auch kein Problem.
      Kann ich aber auch feststellen, ob just in einem Moment gerade ein User das File runterlädt?
      Wäre ja schlecht, wenn ich in dem Moment versuche das File upzudaten.

      steht im LogFile Deines Servers.
      Mit Php hat das Ganze nicht sehr viel zu tun.

      Da isst Du Dich. Aber Ittrum steht jedem zu. Irgendwie müssen komkurrierende Zugriffe geregelt werden. Der Webserver bietet von AHus aus keine automatische Möglichkeit dazu an, wenn ich mich jetzt nicht irre. Man müsste also mindestens eine API bemühen, die das Locking kontrolliert.

      Alos würd ich hier einfach ein Interfach basteln, das den Fileupload realisiert und die Downloads kontolliert. Beise Funktionen müssen dieselben Regeln für das Advisory Locking berücksichtigen oder aber Mandatory Locking benutzen. Leider sind für mandatory Locking die meisten Provider-Filesysteme nicht mit der notwendigen Option mounted.

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

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
  2. Hello,

    ich biete auf meiner Seite ein ZIP-File zum Download an und möchte zum Aktualisieren dieses ZIP-Files den Download kurzzeitig sperren können. Das ist eigentlich auch kein Problem.
    Kann ich aber auch feststellen, ob just in einem Moment gerade ein User das File runterlädt?
    Wäre ja schlecht, wenn ich in dem Moment versuche das File upzudaten.

    Das kommt darauf an, wie Du den Download überwachst und anbietest

    unter http://selfhtml.bitworks.de => Zählen und Speichern in Flatfiles

    findest Du eine Download-Funktion und die Möglichkeit der Sperre.
    Die Funktion flock() http://de3.php.net/manual/en/function.flock.php
    bietet die "Wartesperre" als Default an. (LOCK_NB ist nicht gestetzt)

    Au?erdem arbeite ich fleißig an einem Artikel zum Thema Locking, und werde mal das Szenario des Download mit aufnehmen. Ist eine Variante, die bestimmt öfter vorkommt in den Köpfen, als konkurrierdende Zugriffe auf Datensätze.

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

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
  3. Hallo Sabine,

    an dieser Stelle möchte ich fragen, ob ein auszulieferndes File vom Server solange gelesen wird, wie der Client für die Datenpakete empfänglich ist (was ich mir nicht vorstellen kann), oder ob ein File in einen Puffer eingelesen wird, von dem aus der Client bedient wird?

    Gruß aus Berlin!
    eddi

    --
    Manchmal trifft es einen doch ganz unverhofft t86591:
    > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
    Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
    1. Moin,

      an dieser Stelle möchte ich fragen, ob ein auszulieferndes File vom Server solange gelesen wird, wie der Client für die Datenpakete empfänglich ist (was ich mir nicht vorstellen kann), oder ob ein File in einen Puffer eingelesen wird, von dem aus der Client bedient wird?

      Beides. Da spielen so viele Puffer potentiell eine Rolle dass es fast nicht mehr feierlich ist. Von hinten angefangen: Der TCP/IP-Stack _muß_ gesendete Bytes solange zwischenspeichern bis deren Empfang bestätigt wurde. Ausserdem programmiert man häufig nicht direkt auf den Sockets sondern benutzt eine Stream-Abstraktion der Programmiersprache, die selbst wieder puffert (naja, zumindest kann sie das).

      Dito für das Lesen der Datei: Aus Effizienzgründen wird sie in der Regel in größeren Stücken gelesen und die dann gepuffert. Dann sind da natürlich noch das Betriebssystem, das Dateisystem und die Platte die je nach Tageszeit und Großwetterlage auch verschiedene Puffer unterhalten.

      Wenn die Datenübertragung zum Client temporär stockt kannst du davon ausgehen dass in der Zwischenzeit alle genannten Puffer erstmal gefüllt werden.

      --
      Henryk Plötz
      Grüße aus Berlin
      ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
      ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~
      1. Moin Moin,

        vielen Dank :)

        Gruß aus Berlin!
        eddi

        --
        Manchmal trifft es einen doch ganz unverhofft t86591:
        > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
        Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)