Wie zu beschleunigen file_get_contents?
Hier ist mein code:
$language = $_GET['soundtype'];
$word = $_GET['sound'];
$word = urlencode($word);
if ($language == 'english') {
$url = "<the first url>";
} else if ($language == 'chinese') {
$url = "<the second url>";
}
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"User-Agent: <my user agent>"
)
);
$context = stream_context_create($opts);
$page = file_get_contents($url, false, $context);
header('Content-Type: audio/mpeg');
echo $page;
Aber ich habe festgestellt, dass diese läuft furchtbar langsam.
Gibt es alle möglichen Methoden der Optimierung?
Hinweis: $url
ist eine remote-url.
InformationsquelleAutor der Frage think123 | 2012-12-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist langsam, weil
file_get_contents()
liest die gesamte Datei in$page
PHP wartet, bis die Datei, die empfangen werden, bevor die Ausgabe der Inhalte. Also, was Sie tun, ist: den Download der gesamten Datei auf der server-Seite, dann Ausgabe als einen einzigen großen string.file_get_contents()
unterstützt kein streaming oder greifen offsets der entfernten Datei. Eine option ist die Erstellung einer raw-socket mitfsockopen()
die HTTP-Anfrage, und die Antwort Lesen Sie in einer Schleife, wie Sie Lesen jedes chunk, Ausgabe an den browser. Diese werden schneller, weil die Datei gestreamt werden.Beispiel aus dem Handbuch:
Den oben genannten looping solange es noch Inhalte zur Verfügung, die bei jeder iteration liest er 128 bytes und dann gibt es an den browser. Das gleiche Prinzip funktioniert für das, was du tust. Sie müssen sicherstellen, dass Sie don ' T-Ausgabe die Antwort der HTTP-Header werden die ersten paar Zeilen, denn da du einen raw-Anfrage, erhalten Sie den raw-response mit Header enthalten. Wenn Sie die Ausgabe der response-Header-Sie werden am Ende mit einer beschädigten Datei.
InformationsquelleAutor der Antwort MrCode
Als erklärt von @MrCode, zuerst den Download der Datei auf Ihren server haben, dann übergeben Sie an den Kunden wird natürlich eine Gebühr verdoppelt sich die download-Zeit. Wenn Sie möchten, übergeben Sie die Datei auf dem client direkt, verwenden
readfile
.Alternativ denken, wenn Sie können nicht einfach umleiten des Clientsum die Datei-URL mit einem
header("Location: $url")
so kann der client die Datei direkt von der Quelle.InformationsquelleAutor der Antwort deceze
Statt dem herunterladen der gesamten Datei vor der Ausgabe, betrachten von streaming es so:
Wenn du bist mutig, du könntest auch versuchen (aber das ist auf jeden Fall experimentell):
Eine weitere option ist die Verwendung von internen Weiterleitungen und machen Sie Ihre web-server-proxy die Anfrage für Sie. Das wäre frei von PHP etwas anderes zu tun. Siehe auch mein post in Bezug auf die X-Sendfile und Freunde.
InformationsquelleAutor der Antwort Ja͢ck