2012-03-29 6 views
0

Ich habe dieses Dilemma viele Male - und ich möchte einmal und für alle die Antwort in meinem Kopf anpassen.Php - PRO und CON für Streaming VS. schreiben/cachen

Während Dateien mit PHP erstellen, wie ZIP, PDF oder andere, wird PHP Sie zwei operative Optionen geben:

  • Schreiben auf die Platte.

  • Stream mit Headern zum direkten Download.

Dinge zu beachten sind:

  • Security (die übliche)
  • CPU und dienen Zeit für Datei
  • Dateiintegrität
  • Datei-Updates
  • andere Überlegung, dass ich nicht aufgelistet.

Ein praktisches Beispiel:

Lasst uns sagen, dass ich eine Website haben eine gepackte Zip mit Bildern zum Download bereit.

Wenn ich den zip streame - es wird offensichtlich CPU (und Zeit) kosten.

Wenn ich auf die Festplatte schreiben - es Sicherheitsproblem sein kann (jemand unter der Annahme kann „kriechen“ die Seite, die Zip-Ordner oder Dateien finden irgendwie, und Bulk-Download alle)

Wenn ich auf die Festplatte zu schreiben, werde ich muss auch irgendwie überprüfen, ob die Dateien innerhalb der Zip aktualisiert werden sollen oder nicht, außerdem muss ich die Integrität der Datei überprüfen.

Wie auch immer - ich würde gerne hören, was die Leute darüber zu sagen haben, welche ist die bevorzugte Methode unter welchen Umständen, was sind Best Practices dafür oder andere Erkenntnisse.

Antwort

1

Sicherheit spielt keine Rolle Wenn Sie es richtig machen. Speichern Sie die Dateien nicht in der öffentlichen Webroot oder konfigurieren Sie Ihren Webserver nicht so, dass er diese Dateien nicht direkt bereitstellt.

Mit dem aus dem Weg, es hängt davon ab, was Sie wollen. Wenn Sie die gleiche zip immer wieder bedienen müssen, macht es natürlich Sinn, es einmal zu zippen und es auf die Festplatte zu schreiben, von wo aus Sie es das nächste Mal bedienen werden. Das ist eine einfache Caching Strategie.
Wenn Sie sicherstellen müssen, dass Sie die neueste Version der Zip haben, machen Sie einen Hash des Inhalts in irgendeiner Weise.Zum Beispiel:

  1. Liste der Dateien zip (foo.txt, bar.jpg, baz.doc)
  2. make Hash $hash = md5(foo.txt, bar.jpg, baz.doc)
  3. wenn $hash.zip noch nicht vorhanden ist, erstellen Sie es
  4. $hash.zip

dienen, dass eine typische Caching-Strategie ist um kostspielige Operationen immer wieder zu vermeiden.

+0

Sie sehen - ich lerne schon etwas - ich war dumm genug, um interne CRC zu verwenden - die Datei muss jedes Mal CPU kostet zu öffnen. Verwenden Sie einen Hash, um an den Dateinamen anzuhängen, macht es wirtschaftlicher, denke ich. Kannst du etwas mehr zum "Do it Right" -Teil bezüglich Sicherheit sagen - welche Überlegung sollte ich haben? –

+1

Machen Sie die Datei einfach nicht öffentlich zugänglich. Nur weil Sie es auf die Festplatte schreiben, bedeutet das nicht, dass es jemand herunterladen kann. Das ist nur dann der Fall, wenn Sie es auf Diskette * im öffentlich zugänglichen Webroot * schreiben. Sie können es einfach auf die Festplatte außerhalb des Webroot schreiben, Problem gelöst. – deceze

+0

Dies gilt unter der Bedingung, dass jeder mit dem richtigen Zugriff ALLE Dateien frei herunterladen kann. Aber was, wenn ich den Download auf Datei-zu-Datei-Basis einschränken muss? Wenn Sie nur den ONE-Link für die Berechtigung verwenden, wird dieses Problem nicht gelöst (es sei denn, mir fehlt etwas) –

1

Wenn dieselbe identische zip-Datei mehrmals heruntergeladen wird, ist es sinnvoll, sie zu cachen (auf der Festplatte oder einem anderen persistenten Speicher). Wenn Sie einen Hash für den Inhalt der ZIP-Datei als Teil des Dateinamens angeben (oder den Bezeichner, unter dem Sie die Daten zwischenspeichern), ist es trivial zu sehen, ob der zwischengespeicherte Wert dem entspricht, was Sie liefern möchten.

Wenn eine gegebene Zip-Datei nur einmal heruntergeladen wird, ist es sinnvoller, sie direkt zu streamen.

+0

Ok - aber was, wenn die Datei zum Beispiel die gleiche ist, aber nur einen anderen Namen benötigt (wie Benutzername oder Datum anhängen) - wäre das ein "einmaliger Download"? Und was ist mit Sicherheit beim Caching? –

Verwandte Themen