[php] Bestand fopen en doorsturen naar bezoeker

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Omdat ik wil controleren of iemand is ingelogged op mijn site voordat hij een mp3 kan downloaden gebruik ik nu onder andere dit:
PHP:
1
2
3
4
5
6
header("Content-type: audio/mpeg"); 
header("Content-disposition: filename=bestandsnaam.mp3");
header("Content-length: " . filesize("/home/httpd/vhosts/blabla.nl/httpdocs/rotzooi/mp3/1.mp3")); 
$fp = fopen ("/home/httpd/vhosts/blabla.nl/httpdocs/rotzooi/mp3/1.mp3", "r"); 
fpassthru($fp); 
fclose($fp);

Hij stuurt de data dus netjes door. Dit werkt prima. In ieder geval bij breedband internet. Mijn vraag is of iemand weet of dit ook bij langzame verbindingen werkt of kan ik dan misschien problemen krijgen met time-outs en dergelijke?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Download een bandwith limiter oid en test het zou ik zo zeggen :)

Ik denk niet dat dit voor veel problemen gaat zorgen. Ook bij smallband zal dit waarschijnlijk wel werken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

PHP is al klaar met parsen tegen de tijd dat de bezoeker gaat downloaden, dus ik verwacht geen timeouts. Simpelweg uitproberen lijkt me de beste manier om te kijken. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:28
Ik denk dat je zeker last krijgt van PHP timeouts. PHP checkt time-outs alleen tussen statements door, dus je stuurt altijd wel het hele bestand door, maar er kan altijd een foutmelding na komen als je de file handle probeert te sluiten.

Waarschijnlijk is het gewoon het handigst om de time limit uit te zetten voor dit script. Dat lost je problemen wel op.

offtopic:
In plaats van de combinatie fopen/fpassthru/fclose kun je ook gewoon readfile gebruiken.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Soultaker schreef op 05 september 2004 @ 21:37:
Ik denk dat je zeker last krijgt van PHP timeouts. PHP checkt time-outs alleen tussen statements door, dus je stuurt altijd wel het hele bestand door, maar er kan altijd een foutmelding na komen als je de file handle probeert te sluiten.
Waarom een timeout? De inhoud van de file wordt afgedrukt, en pas na het runnen van het script kan de browser dit opvragen. Dus tegen de tijd dat de browser aan het downloaden slaat, is PHP allang klaar en zie ik geen timeout meer optreden, lijkt me zo. :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • majornono
  • Registratie: Juni 2002
  • Laatst online: 10-03-2023
NMe84 schreef op 05 september 2004 @ 21:43:
[...]

Waarom een timeout? De inhoud van de file wordt afgedrukt, en pas na het runnen van het script kan de browser dit opvragen. Dus tegen de tijd dat de browser aan het downloaden slaat, is PHP allang klaar en zie ik geen timeout meer optreden, lijkt me zo. :?
Correct me if I'm wrong, maar volgens mij ben jij je download kwijt als de timeout optreed.

Problem Exists Between Chair And Keyboard


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

majornono schreef op 05 september 2004 @ 22:52:
Correct me if I'm wrong, maar volgens mij ben jij je download kwijt als de timeout optreed.
Ja.... Maar die timeout treedt dus, zoals ik al zeg, naar alle waarschijnlijkheid niet op...

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • majornono
  • Registratie: Juni 2002
  • Laatst online: 10-03-2023
NMe84 schreef op 05 september 2004 @ 22:55:
Ja.... Maar die timeout treedt dus, zoals ik al zeg, naar alle waarschijnlijkheid niet op...
Meten is weten. Ik denk dat je die timeout bij langzame verbindingen dus wel krijgt.

Problem Exists Between Chair And Keyboard


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

majornono schreef op 05 september 2004 @ 22:56:
Meten is weten. Ik denk dat je die timeout bij langzame verbindingen dus wel krijgt.
Dan mag je mij eens uitleggen waar je dat op baseert. PHP parset eerst het hele script, en begint dan pas met het verzenden van data. fpassthru is in luttele fracties van een seconde klaar, en dat is hier toch echt de langzaamste regel. Dit scriptje is in minder dan een seconde gerund, en dan is PHP klaar; de file wordt verstuurd. Als er dan een timeout optreedt, dan komt dat niet door PHP...

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

NMe84 schreef op 05 september 2004 @ 23:12:
[...]

Dan mag je mij eens uitleggen waar je dat op baseert. PHP parset eerst het hele script, en begint dan pas met het verzenden van data. fpassthru is in luttele fracties van een seconde klaar, en dat is hier toch echt de langzaamste regel. Dit scriptje is in minder dan een seconde gerund, en dan is PHP klaar; de file wordt verstuurd. Als er dan een timeout optreedt, dan komt dat niet door PHP...
dit lijkt inderdaad te kloppen, maar hoe apache dit oplost voor grote files is me nog niet duidelijk.
kleine test met 1MB file:
start: 0.13338400 1094421173
eind: 0.14653700 1094421179
en de download zelf duurde 10sec, het resultaat lijkt me voor zich spreken

edit:

mocht php de output bufferen voor grote files.. en het dus wel lang duurt kan je sowieso set_time_limit(0); gebruiken, waardoor de timeout zeker niet optreedt.

[ Voor 11% gewijzigd door Verwijderd op 05-09-2004 23:55 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:28
PHP buffert uit zichzelf maar een beperkte hoeveeelheid data (by default 4KB, geloof ik). Die buffers worden geleegd door ze naar de webserver te sturen. Ik vermoedde dat Apache wel zou blocken als je er te veel data naar zou sturen, maar blijkbaar gebeurt dat niet en buffer Apache de boel voor je. Vandaar dat het script blijkbaar wel snel klaar kan zijn.

Overigens kwam ik er laatst achter dat PHP met readfile en fpassthru het bestand eerst geheel inleest alvorens 'm door te sturen. Dat kost nogal wat geheugen voor grote bestanden. Misschien is een lusje met fread dus toch verstandiger.

Acties:
  • 0 Henk 'm!

  • majornono
  • Registratie: Juni 2002
  • Laatst online: 10-03-2023
Verwijderd schreef op 05 september 2004 @ 23:54:
[...]
dit lijkt inderdaad te kloppen, maar hoe apache dit oplost voor grote files is me nog niet duidelijk.
@self: :X

Problem Exists Between Chair And Keyboard

Pagina: 1