Können Sie die vom Server gesendeten Header sowohl mit als auch ohne PHP-Skript posten? Ich frage mich, ob das PHP-Skript eine andere Content-Type
sendet, als die Dateien normal zu bedienen.
Es wäre auch eine gute Idee, das type
Attribut auf den source
Elementen anzugeben, so dass der Browser nicht beide Clips herunterladen muss, um festzustellen, ob sie sie abspielen können.
Ich kann Ihr Problem nicht reproduzieren. Ich habe versucht, das Problem in Safari 4.0.4 und das aktuelle WebKit allabendlich mit dem following test page neu zu erstellen. Ich verwende einfach mod_rewrite, um auf der Grundlage eines Parameters anstelle von PHP in andere Formate zu exportieren, aber ich denke nicht, dass das einen Unterschied machen sollte, es sei denn, irgendwie modifiziert PHP die Datei.
Können Sie mein Beispiel ausprobieren und lassen Sie mich wissen, ob es für Sie funktioniert?
bearbeiten Ah. Nachdem Sie etwas mehr herumgestöbert haben, scheint es, dass das Problem auf eine seltsame Weise zurückzuführen ist, dass sich das Element <audio>
in Safari verhält, wenn es versucht, die Größe des Inhalts zu bestimmen.
Hier ist ein Auszug aus einer Paketerfassung von Safari bei einem <audio>
Element, das auf eine Datei zeigt, die direkt von Apache geliefert wird. Wie Sie sehen können, versucht es zuerst, die ersten zwei Bytes des Mediums zu holen, vermutlich damit es eine Inhaltslänge zurückbekommt, und möglicherweise andere Überschriften. Es versucht dann, das Ganze zu holen. Dann versucht es aus unerklärlichen Gründen, die ersten zwei Bytes erneut zu holen, übergibt jedoch entsprechende Caching-Header, um eine "304 Not Modified" -Antwort zu erhalten.Und schließlich, immer noch unerklärlich, holt es die letzten 3440 Bytes der Datei noch einmal. All dies geschieht in getrennten TCP-Verbindungen, was zusätzlich zu dem Aufwand, die Daten ein paar Mal abzurufen, einen beträchtlichen Overhead mit sich bringt.
GET /stackoverflow/audio-test/say-noid3?foo=bar&format=.mp3 HTTP/1.1
Host: ephemera.continuation.org
Range: bytes=0-1
Connection: close
User-Agent: Apple Mac OS X v10.6.2 CoreMedia v1.0.0.10C540
Accept: */*
Accept-Encoding: identity
Cookie: [redacted]
HTTP/1.1 206 Partial Content
Date: Tue, 05 Jan 2010 02:12:48 GMT
Server: Apache
Last-Modified: Tue, 05 Jan 2010 02:02:08 GMT
ETag: "b2a80ad-11f6-47c6139aaa800"
Accept-Ranges: bytes
Content-Length: 2
Content-Range: bytes 0-1/4598
Connection: close
Content-Type: audio/mpeg
# 2 bytes of data
GET /stackoverflow/audio-test/say-noid3?foo=bar&format=.mp3 HTTP/1.1
Host: ephemera.continuation.org
Range: bytes=0-4597
Connection: close
User-Agent: Apple Mac OS X v10.6.2 CoreMedia v1.0.0.10C540
Accept: */*
Accept-Encoding: identity
Cookie: [redacted]
HTTP/1.1 206 Partial Content
Date: Tue, 05 Jan 2010 02:12:48 GMT
Server: Apache
Last-Modified: Tue, 05 Jan 2010 02:02:08 GMT
ETag: "b2a80ad-11f6-47c6139aaa800"
Accept-Ranges: bytes
Content-Length: 4598
Content-Range: bytes 0-4597/4598
Connection: close
Content-Type: audio/mpeg
# 4598 bytes of data
GET /stackoverflow/audio-test/say-noid3?foo=bar&format=.mp3 HTTP/1.1
Host: ephemera.continuation.org
Range: bytes=0-1
Connection: close
User-Agent: Apple Mac OS X v10.6.2 CoreMedia v1.0.0.10C540
Accept: */*
Accept-Encoding: identity
Cookie: [redacted]
If-None-Match: "b2a80ad-11f6-47c6139aaa800"
If-Modified-Since: Tue, 05 Jan 2010 02:02:08 GMT
HTTP/1.1 304 Not Modified
Date: Tue, 05 Jan 2010 02:12:49 GMT
Server: Apache
Connection: close
ETag: "b2a80ad-11f6-47c6139aaa800"
# no data
GET /stackoverflow/audio-test/say-noid3?foo=bar&format=.mp3 HTTP/1.1
Host: ephemera.continuation.org
Range: bytes=1158-4597
Connection: close
User-Agent: Apple Mac OS X v10.6.2 CoreMedia v1.0.0.10C540
Accept: */*
Accept-Encoding: identity
Cookie: [redacted]
HTTP/1.1 206 Partial Content
Date: Tue, 05 Jan 2010 02:12:49 GMT
Server: Apache
Last-Modified: Tue, 05 Jan 2010 02:02:08 GMT
ETag: "b2a80ad-11f6-47c6139aaa800"
Accept-Ranges: bytes
Content-Length: 3440
Content-Range: bytes 1158-4597/4598
Connection: close
Content-Type: audio/mpeg
# 3440 bytes of data
Wie auch immer, wie es mit der Ausgabe Ihres PHP-Skripts umgeht. Hier versucht Safari erneut, die ersten beiden Bytes herunterzuladen, aber Ihr Skript ignoriert die Anforderung Range
und gibt das Ganze zurück. Offensichtlich mag WebKit das nicht, und so versucht es erneut, ohne die Range
Anfrage. Auch hier sendet Ihr Skript den vollständigen Inhalt. Safari versucht es jetzt noch einmal und fügt einen Header Icy-Metadata
hinzu, der anzeigt, dass er denkt, dass er einen Stream herunterlädt und Streaming-Metadaten senden möchte. Es akzeptiert schließlich die Ausgabe von diesem, und das <audio>
Element kann spielen.
GET /say.php?text=this%20is%20a%20test&format=.mp3 HTTP/1.1
Host: tts.mindtrove.info
Range: bytes=0-1
Connection: close
User-Agent: Apple Mac OS X v10.6.2 CoreMedia v1.0.0.10C540
Accept: */*
Accept-Encoding: identity
HTTP/1.1 200 OK
Date: Tue, 05 Jan 2010 02:14:28 GMT
Server: Apache
X-Powered-By: PHP/5.2.10
Content-Length: 4598
Connection: close
Content-Type: audio/mpeg
# 4598 bytes of data
GET /say.php?text=this%20is%20a%20test&format=.mp3 HTTP/1.1
Host: tts.mindtrove.info
Connection: close
User-Agent: Apple Mac OS X v10.6.2 CoreMedia v1.0.0.10C540
Accept: */*
HTTP/1.1 200 OK
Date: Tue, 05 Jan 2010 02:14:28 GMT
Server: Apache
X-Powered-By: PHP/5.2.10
Content-Length: 4598
Connection: close
Content-Type: audio/mpeg
# 4598 bytes of data
GET /say.php?text=this%20is%20a%20test&format=.mp3 HTTP/1.1
Host: tts.mindtrove.info
Accept: */*
User-Agent: Apple Mac OS X v10.6.2 CoreMedia v1.0.0.10C540
Icy-Metadata: 1
Connection: close
HTTP/1.1 200 OK
Date: Tue, 05 Jan 2010 02:14:28 GMT
Server: Apache
X-Powered-By: PHP/5.2.10
Content-Length: 4598
Connection: close
Content-Type: audio/mpeg
# 4598 bytes of data
Zusammenfassend scheint es, dass Safari (oder genauer gesagt, Quicktime, die Safari alle Medien und Medien-Download behandeln verwendet) zum Herunterladen von Medien einen völlig braindamaged Ansatz hat. Etwas in der Art und Weise, wie Sie Ihre Daten zurücksenden, wahrscheinlich die Tatsache, dass Sie nicht auf Range
Anfragen reagieren, lässt vermuten, dass Sie Streaming-Medien senden, was dazu führt, dass der Inhalt wiederholt heruntergeladen wird (auch wenn er mit einem Server konfrontiert wird antworten Sie auf eine Range
Anfrage, es tut immer noch mehrere Anfragen, als es wirklich braucht).
Mein Rat wäre zu versuchen, auf Range
Anfragen angemessen zu reagieren; wenn Medien bedient werden, verwenden Browser wahrscheinlich sie, um zu versuchen, die Bandbreite zu minimieren, indem sie nur so viel puffern, wie sie brauchen, um durchzuspielen (obwohl das autobuffer
Attribut anzeigt, dass sie möchten, dass sie das ganze Ding, Browser buffst könnte das ignorieren). Ich würde empfehlen, zu verwenden, damit Apache mit dem Dienen der Datei-, Caching- und Bereichsanforderungen fertig wird, aber Sie scheinen auf Dreamhost zu sein, das nicht mod_xsendfile
installiert hat, so dass Sie Ihre eigene Range
Behandlung rollen müssen.
Ich bin mir nicht sicher, ob Sie über Bearbeitungen benachrichtigt werden, aber ich habe meine Antwort so bearbeitet, dass sie einen Testfall enthält, der für mich funktioniert und scheinbar mit dem übereinstimmt, was Sie tun. Können Sie überprüfen, ob mein Testfall auch für Sie funktioniert? –