Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pobieranie pliku w locie
Forum PHP.pl > Forum > Przedszkole
sannin
Witam,

chcę wysyłać do użytkownika plik który jest generowany podczas jego pobierania. Już tłumaczę o co chodzi z bazy danych są pobierane informację zazwyczaj około 100mb i wysyłane do użytkownika. Żeby nie generować masy plików chcę to wysyłać w locie próbowałem tak:

Kod
require('varibleStream.php');

stream_wrapper_register("test", "MyStream") or die("Failed to register protocol");
$fp = fopen("test://MyTestVariableInMemory", "r");

header("Pragma: no-cache");
header("Content-Type: application/force-download");
header("Expires: 0");
header("Content-Length: 104857600");
header("Content-Transfer-Encoding: binary");
@header('Content-Disposition: attachment; filename="test.txt"');
fpassthru($fp);
fclose($fp);


ale problem jest taki, że skrypt czeka do wykonania funkcji:

Kod
public function stream_read($count) {
        //....
        while($r = mysql_fetch_array($q)) {
            echo $r[0];
        }
        //...
    }


Nie wiem czy ogólnie dobrze kombinuję. Chodzi mi o to, że to co zostało pobrane częściowo z bazy ma być od razu wysyłane do użytkownika i kasowane z pamięci (podczas pobierania całego pliku). Nie proszę o gotowy skrypt, a jakieś wskazówki czym się zainteresować, żeby zrobić coś takiego.

Noidea
Zabawa z mysql_fetch_array nic ci nie da, bo dane z bazy pobierane są do pamięci już w czasie wykonania mysql_query().

Spróbuj najpierw użyć mysql_unbuffered_query:
  1. <?php
  2.  
  3. // Tu idą nagłówki
  4.  
  5. $res = mysql_unbuffered_query( "Zapytanie zwracające 100mb danych" );
  6. while( $row = mysql_fetch_assoc( $res ) )
  7. {
  8. // Tu wysyłasz dane
  9.  
  10. flush(); // jeśli używasz buforowanego wyjścia, to wcześniej jeszcze ob_flush();
  11. }
  12.  
  13. ?>

i sprawdź jak to wpłynie na pamięć. Poczytaj też w manualu jakie ograniczenia wprowadza ta funkcja.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.