this document in Abschnitt 14.14 besagt, dass In HTTP, sollte es immer dann, wenn die Länge der Nachricht gesendet werden können, bevor sie übertragen bestimmt werden, sofern dies nicht durch die Regeln in Abschnitt 4.4 verboten ist. Dies bedeutet, dass es nicht gesendet werden muss, wenn Sie nicht sagen können, wie groß es ist.
Senden Sie es einfach nicht.
Wenn Sie Teile der Daten an den Browser senden möchten, bevor alle Daten verfügbar sind, tun Sie flush Ihren Ausgabepuffer? Vielleicht ist das das Problem, nicht das Fehlen eines Headers?
Die Art und Weise bündig verwenden ist wie folgt aus:
- eine Ausgabe erzeugen, die es in den Puffer es
- flush() hinzufügen sollten, die an den Client aktuellen Puffer senden soll
- goto 1
Also, wenn Ihre Abfrage viele Ergebnisse zurückgibt, können Sie nur die Erzeugung Ausgabe für, sagen wir, 100 oder 1000 von ihnen, dann flush, und so weiter.
Um dem Client-Browser mitzuteilen, dass er versuchen soll, eine Datei zu speichern, anstatt sie im Fenster anzuzeigen, können Sie auch den Header Content-disposition: attachment verwenden. Siehe den specification hier, 19.5.1 Abschnitt.
Ich habe die Header, dann habe ich Flush, dann habe ich die SQL-Abfrage. Es erscheint jedoch kein Speicherdialog nach dem Flush. Wenn es sich um eine kleine Datei handelt, erscheint sie nur, wenn die Datei heruntergeladen wurde. Die sql-Abfrage, die ich versuche, dauert 45 Sekunden und hält das Zeitlimit nach dem Senden der Header an. – phazei
angegeben ein bisschen mehr in der anwser – kender
Meine Kopfzeilen: Header ('Content-Type: "'. $ Mime. '"'); header ('Content-Disposition: Anhang; Dateiname =' '. $ Dateiname.' "'); Header ("Content-Transfer-Encoding: Binär"); Header ('läuft ab: 0'); Header ('Pragma: kein Cache'); – phazei