2016-04-30 17 views
2

Ich hatte die Notwendigkeit, sehr große Dateien (1Gb +) von meinem Webserver mit PHP und Authentifizierung zu bedienen, so dass nur einige Kunden die Rechte zum Download von Dateien hatte.Herunterladen von großen Dateien mit PHP mit mod_xsendfile unter Linux

Ich wollte keine direkten Links verwenden und die Verwendung eines PHP-Skripts zum Bedienen der Dateien war aufgrund von Speicher- und Zeitüberschreitungsgrenzen keine Option.

Mein Webserver ist mit Plesk verwaltet und läuft auf Apache/CentOS 6.

Antwort

4

Die gewählte Lösung mod_xsendfile auf dem Centos-Server zu installieren war, es zu konfigurieren und die Dateien mit PHP-Header nach der Benutzerauthentifizierung senden.

Installation von mod_xsendfile auf Centos. Sie müssen EPEL Repository bekommen xsendfile, danach eine einfach aktivieren:

yum update 
yum install mod_xsendfile 

danach können Sie überprüfen, ob das Modul korrekt mit installiert:

apachectl -M | grep xsendfile 

Die Konfiguration/Plesk Teil. Plesk generiert jede httpd.conf-Datei automatisch, so dass die Änderung der Dateien von Hand gefährlich ist, da sie von jeder Änderung, die über die Plesk-Benutzeroberfläche vorgenommen wird, überschrieben werden kann. Standardmäßig sind die http.conf Datei eine vhost.conf und vhost_ssl.conf, für virtuelle Hosts die gespeichert sind in

/var/www/vhosts/system/[yourvhostname]/conf 

Sie entweder können sie per ssh bearbeiten oder die Plesk UI-Schnittstelle (vhost -> Servereinstellungen -> zusätzliche Apache-Richtlinien). Für nicht Plesk-Benutzer nur die folgenden Richtlinien unter dem richtigen vHost Abschnitt Ihrer httpd.conf hinzufügen

erste Mal, dass ich der Server einige Probleme hatte verursachen 0 Byte Dateien sendete, nachdem einige Test, den ich die richtigen Richtlinien zu finden sind:

<Directory "/"> 

    EnableSendfile on 

    XSendFile on 

    # Absolute path, no trailing slash! 
    XSendFilePath "/var/www/vhosts/[yourvhostname]/storage" 

</Directory> 

Hinweis, wenn ich eine andere Directory-Direktive als "/" verwende, bekomme ich leere Dateien und überhaupt keine Fehler in irgendeinem Protokoll. Nicht getestet, was passiert, wenn ein relativer Pfad in den Headern übergeben wird.

return response(null) 
     ->header('Content-Type' , 'application/octet-stream') 
     ->header('Content-Disposition', 'attachment; '.$filename) 
     ->header('X-Sendfile', $fullfilepath); 

Hope this jemand Stunden Test vermeiden hilft:

Cause I Laravel als PHP-Framework bin mit, kann die Datei dann mit dem Benutzer gesendet werden.

2

Darios Kommentar ist sehr hilfreich. Ich wollte nur hinzufügen, was ich für den Laravel return-Anweisung, um sicherzustellen, dass verwendet werden, die Dateien korrekt benannt:

return response(null) 
    ->header('Content-Type' , 'application/octet-stream') 
    ->header('Content-Disposition', 'attachment; filename="' . $filename . "') 
    ->header('X-Sendfile', $fullfilepath); 
+0

Im Klar PHP-Header sind einfach Strings, so 'header (‚X-Sendfile:‘. $ Dateipfad); 'wäre was man verwenden möchte. – dothebart

Verwandte Themen