2009-06-16 7 views
3

Aus verschiedenen Gründen muss ich den Vermittler zwischen einer HTTP-Anforderung und einer Datei auf der Festplatte spielen. Mein Ansatz bestand darin, Header zu füllen und dann eine Read-Datei ('/ Pfad/zu/Datei.jpg');PHP Passthrough langsam

Jetzt funktioniert alles gut, außer, dass es sehr langsam sogar ein mittelgroßes Bild zurückgibt.

Kann mir jemand bieten eine effizientere Möglichkeit, die Datei von Streaming zum Client, sobald die Header gesendet wurden?

Hinweis: es ist eine Linux-Box in einer Umgebung mit Shared-Hosting, wenn es

+0

Wäre nett, wenn Sie das OS einschließen, das Sie verwenden. –

Antwort

3

Mehrere Webserver erlauben einem externen Skript, genau das zu tun. X-Sendfile auf Apache (mit mod_xsendfile) ist eins.

Kurz gesagt, alles, was Sie senden, ist Kopfzeilen. Der spezielle Header weist den Webserver an, die benannte Datei als Hauptteil der Antwort zu senden.

+0

Dang, ich bin in einer Shared Hosting-Umgebung und scheint dieses Modul nicht zu unterstützen. –

0

zählt, Sie bei der Umsetzung bedingte GET-Request-Unterstützung starten konnte.

Senden Sie einen "Last-Modified" Header mit der Datei und antworten Sie mit "304 Not Modified" immer wenn der Client die Datei mit "If-Modified-Since" anfordert und Sie sehen, dass die Datei nicht geändert wurde. Einige sinnvolle Frische-Informationen (über "Cache-Control"/"Expires" -Kopfzeilen) sind ebenfalls ratsam, um wiederholte Anfragen nach einer unveränderten Ressource an erster Stelle zu verhindern.

Auf diese Weise zumindest die gefühlte Leistung verbessert werden kann, auch wenn Sie, dass Sie nichts über die tatsächliche Leistung tun können, finden sollte.

+0

Bereits erledigt. Löst das Problem jedoch nicht, da es beim ersten Laden immer noch schmerzhaft langsam ist. –

+0

Ich sehe. Okay, ich lasse die Antwort hier für Leute, die über Google eintreffen. – Tomalak

-2

Grundsätzlich wollen Sie einen Server bauen ... Das ist nicht trivial.

Es ist ein sehr vielversprechendes Projekt eines PHP-basierten Servers: Nanoweb.

Es ist kostenlos und vollständig erweiterbar.

0

Dies sollte eigentlich ziemlich schnell sein. Wir haben dies mit großen Bildern ohne Probleme gemacht. Machst du etwas anderes, bevor du das Bild ausgibst, das den Prozess verlangsamen könnte, zum Beispiel das Berechnen einiger Metadaten auf dem Bild?

Edit: Sie müssen die Ausgabe und Verwendung fread spülen. IE:

$fp = fopen($strFile, "rb"); 
//start buffered download 
while(!feof($fp)) 
    { 
    print(fread($fp,1024*16)); 
    flush(); 
    ob_flush(); 
    } 
fclose($fp); 
+0

nein. Wenn das das Problem wäre, würde ich zuerst eine Verzögerung und dann eine schnelle Last erleben, aber ich verspüre einen langsamen Durchsatz ohne erkennbare Anfangsverzögerung. –

+0

Wenn das Problem der Durchsatz ist, könnten Sie versuchen, fread zu verwenden, es ist tatsächlich schneller. Siehe diesen Kommentar: http://us3.php.net/manual/en/function.fpassthrup.php#55001 –

+0

Ich sollte erwähnen, dass durch php gehen wird immer etwa 4 mal langsamer als Apache es liefern lassen. –