Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] cURL / fsockopen - jak odczytać pobraną ilość danych na żywo ?
vimoco
post
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 23.07.2009

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


Witka!

Mam pytanie do Was chłopaki, gdyż chciałbym zliczyć na żywo ile użytkownik mojej strony pobrał danych pliku.
Przykładowo pobiera 100 mb plik, gdy przerwie na np. 33 mb to chce mieć zapisane w MySQL / pliku, także jeżeli dalej będzie pobierałi dokończy to żeby całą wage pliku dopisało.

Pliki podaje poprzez header + cURL lub fsockopen + stream_get_line

Przy cURL probowałem z WRITEFUNCTION, jednak że ona działa poprawnie ale tylko przy pobieraniu przez przeglądarkę np. taki dodatek FDM (Free Download Manager) czy też IDM (Internet Download Manager) to wszystko psuje, i wyświetla / zapisuje błędne wyniki.

taka funkcja:
  1. function zapiszRozmiar($handle, $content){
  2. $lenght = strlen($content);
  3. file_put_contents("pobrano", file_get_contents("pobrano") + $lenght);
  4. echo $content;
  5. return $lenght;
  6. }


dopisek do cURL:
  1. curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'zapiszRozmiar');


Tak samo dzieje się przy fsockopen, gdy zastosuje taki kod:
  1. while (!feof($fp) && (connection_status()==0)) {
  2. $recv = @stream_get_line($fp, 1024);
  3. file_put_contents("pobrano", file_get_contents("bytesDownload") + strlen($recv));
  4. @print $recv;
  5. @flush();
  6. }


Również przy akceleatorze FDM / IDM zwraca błędne wyniki np. pobranie 100 MB pokazuje 9, 12, 33 megajbaty pobrane.

Ma ktoś jakąś ideę ?

Dzięki z góry.
Pozdrawiam,

Ten post edytował vimoco 12.08.2012, 23:28:08
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
wNogachSpisz
post
Post #2





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


OK. Zatem jedziemy:

1. Opłaca się skorzystasz z biblioteki, która kompleksowo obsłuży pobieranie pliku, to zagwarantuje, że żaden szczegół nie zostanie pozostawiony przypadkowi. Mowie oczywiście o PEAR:HTTP_Download. Nie wspomnę o całej masie przydantych opcji jak zarządzanie cachowaniem czy ograniczanie prędkości pobierania.

2. Przy pomocy funkcji „stream_wrapper_register” definiujesz własną klasę do obsługi strumieni tzw. „stream wrapper”. Opis jak to zrobić znajduje się tutaj

3. Powiązujesz stream wrapper z obiektem PEAR:HTTP_Download
przy pomocy metody: HTTP_Download::setResource

Teraz najważniejsze.
Twój stream wrapper musi w metodzie „stream_read()” podnosić licznik danych odczytanych z uchwytu pliku oraz sprawdzać czy ten licznik przekroczył 1MB. Jeśli przekroczył, aktualizujesz bazę. Wszystkie uchwyty do bazy możesz otworzyć i zamknąć wewnątrz obiektu stream wrapper.

Jarzysz?

// Edit
Dodatkowo aktualizujesz bazę w metodzie stream_close(), tak żeby nie dało się omijać licznika sztuczką polegającą na opalalaniu zapytań http-range z którkim zakresem bajtów, na co cierpi co drugi hosting plików (IMG:style_emoticons/default/happy.gif) .

Ideał to event typu "chunkSended" emitowany przez HTTP_Downlad, pod który podpinamy się z listenerem podnoszącym licznik, niestety nic takiego nie jest dostępne.

Ten post edytował wNogachSpisz 19.08.2012, 20:31:56
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 14.10.2025 - 01:29