ugrás a tartalomhoz

The “right way” to handle file downloads in PHP

inf · 2014. Május. 20. (K), 12.21
Fájl letöltés kezelése PHP-vel
 
1

Tetszett

zzrek · 2014. Május. 20. (K), 17.52
Tetszett. Két kérdés merült fel bennem (pusztán érdeklődés szintjén):
Miben különbözik a streaming és a range támogatott download?
Ezzel kapcsolatosan: lehet olyan letöltést is csinálni, amikor ismeretlen a fájlméret; jól láttam, hogy ilyenről nem szólt a cikk?
2

Miben különbözik a streaming

inf · 2014. Május. 20. (K), 18.34
Miben különbözik a streaming és a range támogatott download?

Nem biztos, hogy jó a válasz, de szerintem abban, hogy a range folytatható. A range header-ben el lehet küldeni, hogy mettől meddig szeretnéd leszedni a tartalmat, és ez nem feltétlen csak fájlokra vonatkozik, pl listáknál is meg lehet csinálni ugyanígy... Gondolom a resumable download abban különbözik a normáltól, hogy a php figyelembe veszi a küldött range header-t, illetve ő maga is küld vissza ilyet.

Ezzel kapcsolatosan: lehet olyan letöltést is csinálni, amikor ismeretlen a fájlméret; jól láttam, hogy ilyenről nem szólt a cikk?

Elméletben lehetséges, gondolom akkor, ha nem küldesz ki content length-et. (Elvileg gzip, deflate, stb... szintén zavarják a content length-et, úgyhogy oda speciális kód kell.) Gyakorlatban nem látom értelmét az ismeretlen méretnek, rontja a felhasználói élményt.
3

Elvileg gzip, deflate, stb...

Joó Ádám · 2014. Május. 20. (K), 19.06
Elvileg gzip, deflate, stb... szintén zavarják a content length-et, úgyhogy oda speciális kód kell.


Nem tudom, hogy itt mire gondolsz. A Content-Length a tömörített válasz hossza.
4

Igen, de ha php-val akarsz

inf · 2014. Május. 20. (K), 22.16
Igen, de ha php-val akarsz gzip-et és range request-et együtt használni, akkor kénytelen vagy a tömörítést is a php-ra bízni.

Úgy nézem, hogy x-sendfile + gzip + range együtt még nem feltétlen megoldott http szerver szinten, úgyhogy alternatíva nem nagyon van védett fájlok esetén. (Publikus fájloknál valószínűbb, hogy működik a range és a gzip együtt a http szerveren.)
5

Nincs is ertelme

janoszen · 2014. Május. 22. (Cs), 11.34
Nincs is ertelme, gondolj bele:

  • A gzipnek leginkabb a szoveges allomanyoknal van ertelme.
  • Kis fajloknal tok mindegy a range.
  • Nagy fajlok tipikusan nagyon rosszul tomorithetoek, mert eleve tomoritettek.


Innentol kezdve tenyleg folosleges ezen erolkodni. Profi modon egyebkent ugy oldjak meg, hogy a download-okat biztosito szerver ad egy download ticketet (URL-t) amin letoltheto a file es nem PHP-bol szolgalod ki a fajlokat.
6

Sebesség

Hidvégi Gábor · 2014. Május. 22. (Cs), 11.54
Az írás jó, annyival egészíteném ki, hogy ha nem muszáj, nem érdemes php-ból kiszolgálni a letöltést, mert nem igazán hatékony.

Nálunk annyival van még a kód megbolondítva, hogy szabályozni tudjuk a letöltés sebességét:

//Ekkora darabokat küldünk ki, 512 kilobájt másodpercenként
$darab = 512384;
for ($i = 0, $l = ceil(filesize($fajlnev) / $darab); $i < $l; $i++) {
  echo file_get_contents($fajlnev, false, null, $i * $darab);
  flush();
  sleep(1);
}