Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Pobieranie pliku który jest aktualnie tworzony
Forum PHP.pl > Forum > Przedszkole
Hectic
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.
Noidea
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. ?>
Hectic
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.
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.