Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Curl zliczanie pobranych danych
Forum PHP.pl > Forum > Przedszkole
sannin
Cześć,

użytkownik pobiera plik z serwera za pomocą curl. Jak zliczyć ile danych pobrał? Plik ma dajmy 100 mb, ale zatrzymał pobieranie w połowie, jak to zliczyć?
Sephirus
Zapoznaj się w CURL z CURLOPT_WRITEFUNCTION oraz CURL_GETINFO czy jakoś tak - pozwala to na zapisywanie pliku po określonych chunk'ach (częściach o danym rozmiarze bajtów) można wówczas zapisywać gdzieś ile bajtów się pobrało. Po wykrzaczeniu ta zmienna będzie miała wielkość pobranego do tej pory pliku.
sannin
Działa całkiem fajnie, tylko jest problem tego typu, że jeśli pobieram plik ze swojego serwera za pomocą jakiegoś akceleratora pobierania który nawiązuje kilka połączeń do pliku to przekłamuję ilość pobranych danych nawet o kilka mb. Funkcja wygląda tak:

  1. function curlHeaderCallback($c, $str){
  2. global $file;
  3.  
  4. $l = strlen($str);
  5. mysql_query("UPDATE downloads SET byte = byte + {$l} WHERE file_id='{$file['id']}';");
  6. echo $str;
  7.  
  8. return $l;
  9. }


Przyjrzałem się dzisiaj sprawie dość dokładnie i wygląda na to, że programy przyspieszające pobieranie, zwiększają ilość danych. Po zapisaniu do pliku, faktycznie jego wielkość jest taka jak zostało wyliczone. Wychodzi na to, że podczas kilku połączeń pewne cześć pliku zazębiają się i dane są powielane. Sam plik po pobraniu działa. Może ktoś ma większą wiedzę na ten temat i się wypowie?
cycofiasz
Akceleratory pobierania często dzielą plik na kilka części (nagłówek HTTP_RANGE) i raczej nie zazębiają kolejnych partów bo i po co. Pamiętaj że każde żądanie to nie tylko treść pliku ale i nagłówek http więc on może zawyżać ilość wysłanych danych.
sannin
Sprawdziłem i jest faktycznie tak jak mówiłem. Free Download Manager wysyła zapytanie do serwera:
Cytat
GET /pliki/test.txt HTTP/1.1
Accept: */*
Range: bytes=8451356-
User-Agent: FDM 3.x
Connection: Keep-Alive
Cache-Control: no-cache

Czyli wysyła informację od której miejsca chce zacząć, a nie podaje w którym miejscu chce kończyć. Ja natomiast odsyłam do programu coś takiego:
Cytat
HTTP/1.1 206 Partial Content
Date: Wed, 02 Nov 2011 09:45:06 GMT
Server: Apache
Content-Range: bytes 8451356-9014779/9014780
Content-Length: 563424
Accept-Ranges: bytes
Content-Disposition: attachment; filename=test.txt
Vary: Accept-Encoding,User-Agent
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: application/force-download

Muszę podać bajty na których skończy się pobieranie inaczej program wyświetli komunikat, że serwer nie wznawia pobierania. Za pomocą CURLOPT_WRITEFUNCTION zapisywałem pobierane dane z każdego połączenia do osobnego pliku na serwerze. Po sprawdzeniu - faktycznie mają taką wielkość jaka jest zliczana podczas pobierania. Natomiast po otwarciu, sprawdziłem i pobrane dane powielają się. Jak rozwiązać ten problem?
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.