Autor Beitrag
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 23.07.10 19:49 
Moin!

Bisher liefere ich angeforderte Downloads per http mit readfile() aus (klar, vorher Header raushauen).

Man findet allerdings auch solch spannende Anleitungen/Diskussionen, wo ein Ansatz per fopen/fread-output-Schleife/fclose mit Chunks gemacht wird (jetzt mal unabhängig von dem FTP-Geschwafel in dem Thread).

Hat da jemand tiefschürfendere Erkenntnisse gesammelt? Ist das wirklich "besser"? :nixweiss: Oder anders: was macht Sinn? :les:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 23.07.10 20:20 
Ich fass mich grad mal kurz:

Möchte man ständig NUR die gesamte Datei ausgeben, kann readfile (was unter Unix über die POSIX-API memory-mapped ist) schneller sein; möchte man hingegen auch continuable Downloads mit full-spec RFC-konformer Range-Implementierung haben, muss man über fopenreadclose gehen.

Soviel zur Nutshell.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Fr 23.07.10 21:31 
Hängt, wie BenBE schon vom Anwendungsfall an. In den meisten Fällen reicht readfile - es gibt aber auch stellen, wo man mehr Aufwand betreiben muss (siehe hier)
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 25.07.10 12:35 
Moin!

Danke schonmal für eure Tipps. ;)

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Möchte man ständig NUR die gesamte Datei ausgeben, kann readfile (was unter Unix über die POSIX-API memory-mapped ist) schneller sein;
Es geht mir genauer gesagt nicht wirklich um Speed, sondern um Stabilität. Ich möchte vermeiden die Datei - wie es so schön in der PHP-Doku heißt - "in den Ausgabepuffer zu schreiben". Da nach den Headern eh nur noch die binären Daten des Files kommen, kann das direkt rausgereicht werden. Anders gesagt: ich will den PHP-Prozess, der die Datei ausliefert, nicht unnötig aufblähen. Die Dateien können schonmal etwas größer sein (ca. 20MB). Es handelt sich übrigens (aus diversen, hier nicht diskussionsfähigen Gründen) um einen xampp. :idea:

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
möchte man hingegen auch continuable Downloads mit full-spec RFC-konformer Range-Implementierung haben, muss man über fopenreadclose gehen.
Ist hier nicht erforderlich. Aber aus rein präventiv-neugierigen Gründen: was wäre denn da genau zu tun? :les:


user profile iconHeiko hat folgendes geschrieben Zum zitierten Posting springen:
In den meisten Fällen reicht readfile - es gibt aber auch stellen, wo man mehr Aufwand betreiben muss (siehe [url=dev.contao.org/issues/2178]hier[/url])
Ich hab mir den Thread jetzt ein paar mal genau angesehen, aber ausser, dass readfile() angeblich Dateien nicht im Binärmodus offnen soll (kann ich mir kaum vorstellen, ehrlich gesagt, macht doch wirklich keinen Sinn), kann ich der genannten Quelle keine sinnvollen Tipps entnehmen. Kannst du deinen Fokus mal etwas präzisieren? :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 25.07.10 13:23 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Moin!

Danke schonmal für eure Tipps. ;)

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Möchte man ständig NUR die gesamte Datei ausgeben, kann readfile (was unter Unix über die POSIX-API memory-mapped ist) schneller sein;
Es geht mir genauer gesagt nicht wirklich um Speed, sondern um Stabilität. Ich möchte vermeiden die Datei - wie es so schön in der PHP-Doku heißt - "in den Ausgabepuffer zu schreiben". Da nach den Headern eh nur noch die binären Daten des Files kommen, kann das direkt rausgereicht werden. Anders gesagt: ich will den PHP-Prozess, der die Datei ausliefert, nicht unnötig aufblähen. Die Dateien können schonmal etwas größer sein (ca. 20MB). Es handelt sich übrigens (aus diversen, hier nicht diskussionsfähigen Gründen) um einen xampp. :idea:

Jegliche Ausgaben gehen generell über das Output-System von PHP, man kann hier aber diht kurz halten, wenn man nicht noch unnötige Handler wie Tidy oder den GZ-Handler in die Kette aufnimmt, wenn man die nicht zwingend braucht.

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
möchte man hingegen auch continuable Downloads mit full-spec RFC-konformer Range-Implementierung haben, muss man über fopenreadclose gehen.
Ist hier nicht erforderlich. Aber aus rein präventiv-neugierigen Gründen: was wäre denn da genau zu tun? :les:

Im Server-Array werden jegliche Header der Client-Anfrage gespiegelt. Dort entsprechend die Felder nach RFC 2616 Abschnitt 14.35 auswerten:
www.w3.org/Protocols...-sec14.html#sec14.35

Ein Beispiel, wie sowas aussehen könnte, findet man hier: phpforum.de/forum/showthread.php?t=251490

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconHeiko hat folgendes geschrieben Zum zitierten Posting springen:
In den meisten Fällen reicht readfile - es gibt aber auch stellen, wo man mehr Aufwand betreiben muss (siehe [url=dev.contao.org/issues/2178]hier[/url])
Ich hab mir den Thread jetzt ein paar mal genau angesehen, aber ausser, dass readfile() angeblich Dateien nicht im Binärmodus offnen soll (kann ich mir kaum vorstellen, ehrlich gesagt, macht doch wirklich keinen Sinn), kann ich der genannten Quelle keine sinnvollen Tipps entnehmen. Kannst du deinen Fokus mal etwas präzisieren? :nixweiss:

cu
Narses

Die IO-API unter Unix unterscheidet zwischen Textmodus und Binärmodus. Beim Text-Modus werden Zeilenumbrüche verwurschtelt. Was natürlich für deinen Zwecks nicht soooo brauchbar ist ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 25.07.10 20:31 
Moin!

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Jegliche Ausgaben gehen generell über das Output-System von PHP
OK, nehme ich das mal so hin. :nixweiss:

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Ein Beispiel, wie sowas aussehen könnte, findet man hier: phpforum.de/forum/showthread.php?t=251490
Danke, das hat geholfen. :zustimm:

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Die IO-API unter Unix unterscheidet zwischen Textmodus und Binärmodus. Beim Text-Modus werden Zeilenumbrüche verwurschtelt.
Ah :shock: Daraus folgt ganz klar: für Binär-Downloads Finger weg von readfile()! :think:

Danke nochmal. :)

cu
Narses

//EDIT: fread durch readfile ersetzt.

_________________
There are 10 types of people - those who understand binary and those who don´t.


Zuletzt bearbeitet von Narses am So 25.07.10 20:48, insgesamt 1-mal bearbeitet
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: So 25.07.10 20:43 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Ah :shock: Daraus folgt ganz klar: für Binär-Downloads Finger weg von fread()! :think:

Ne, Finger weg von readfile. Bei fopen musste ja nur rb angeben und danach kannst du fread() benutzen
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 25.07.10 20:48 
Moin!

user profile iconHeiko hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Ah :shock: Daraus folgt ganz klar: für Binär-Downloads Finger weg von fread()! :think:

Ne, Finger weg von readfile. Bei fopen musste ja nur rb angeben und danach kannst du fread() benutzen
Klar, leicht konfus heute. :nut: Danke. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.