Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Pobieranie pliku który jest aktualnie tworzony
Hectic
post 8.12.2010, 15:21:29
Post #1





Grupa: Zarejestrowani
Postów: 256
Pomógł: 7
Dołączył: 1.01.2005

Ostrzeżenie: (0%)
-----


Witam,
zastanawiam się czy da się wykonać coś takiego. Skrypt pobiera z kilku serwerów pliki i je łączy (w pętli każdy po kolej zostaje dopisany do pliku calosc.tmp). Chciałbym aby np. po pobraniu dwóch plików użytkownik dostawał możliwość pobrania tego pliku. W moim obecnym rozwiązaniu nawet jeżeli wyśle nagłówek z obliczoną wielkością pliku (np. 50 MB), a użytkownik rozpocznie pobieranie w momencie gdy gotowe będzie 20 MB to przeglądarka ściągnie tylko 20. Czy jest jakiś sposób żeby sobie z tym poradzić ?
Pozdrawiam.


--------------------
Nie proś o to, idź i sam to zdobądź.
Zrób to, a osiągniesz sukces.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
Noidea
post 8.12.2010, 16:05:07
Post #2





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

Ostrzeżenie: (0%)
-----


Nie można jednocześnie zapisywać i odczytywać danych z jednego pliku. Gdy rozpoczynasz pobieranie, to nie dajesz szansy drugiemu skryptowi dopisywać danych do pliku. Zorganizuj to mniej więcej tak (pehapo-pseudokod):

Skrypt zapisujący do pliku tmp
  1. <?php
  2.  
  3. $fp = fopen( "calosc.tmp", "wb" );
  4.  
  5. while( są_jeszcze_jakieś_dane_na_serwerach() )
  6. {
  7. $bufor = pobierz_trochę_danych();
  8.  
  9. flock( $fp, LOCK_EX );
  10. fwrite( $fp, $bufor );
  11. flock( $fp, LOCK_UN );
  12. }
  13.  
  14. fclose( $fp );
  15.  
  16. ?>



Skrypt odczytujący z pliku tmp:
  1. <?php
  2.  
  3. $pobrano_bajtow = 0;
  4. $spodziewana_wielkosc_pliku = 50 * 1024 * 1024;
  5.  
  6. // Naglowki
  7.  
  8.  
  9. $fp = fopen( "calocs.tmp", "rb" );
  10.  
  11. while( $pobrano_bajtow < $spodziewana_wielkosc_pliku )
  12. {
  13. clearstatecache();
  14. $wielkosc_pliku = filesize( "calosc.tmp" );
  15. while( $wielkosc_pliku < $spodziewana_wielkosc_pliku && $pobrano_bajtow > ( $wielkosc_pliku - 4096 ) )
  16. {
  17. usleep( 100000 );
  18. }
  19.  
  20. flock( $fp, LOCK_EX );
  21. $bufor = fread( $fp, 4096 );
  22. flock( $fp, LOCK_UN );
  23.  
  24. $pobrano_bajtow += strlen( $bufor );
  25. echo $bufor;
  26. }
  27.  
  28. fclose( $fp );
  29.  
  30. ?>


Ten post edytował Noidea 8.12.2010, 16:08:40


--------------------
Go to the top of the page
+Quote Post
Hectic
post 8.12.2010, 16:16:22
Post #3





Grupa: Zarejestrowani
Postów: 256
Pomógł: 7
Dołączył: 1.01.2005

Ostrzeżenie: (0%)
-----


Z tego co widzę to przez cały czas pobierania pliku będzie wykonywał się skrypt, co przy dużych plikach się nie sprawdzi. Chodzi mi o coś bardziej w stylu oszukania przeglądarki, że jak raz dostanie dane do pliku to go sobie będzie pobierać (serwer w między czasie będzie go kończył). Obecnie pobiera mi tylko tą cześć pliku która jest gotowa w momencie wysłania nagłówków.


--------------------
Nie proś o to, idź i sam to zdobądź.
Zrób to, a osiągniesz sukces.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 10:24