Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Curl zliczanie pobranych danych
sannin
post
Post #1





Grupa: Zarejestrowani
Postów: 308
Pomógł: 13
Dołączył: 31.10.2008

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


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ć?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Sephirus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


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.
Go to the top of the page
+Quote Post
sannin
post
Post #3





Grupa: Zarejestrowani
Postów: 308
Pomógł: 13
Dołączył: 31.10.2008

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


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?
Go to the top of the page
+Quote Post
cycofiasz
post
Post #4





Grupa: Zarejestrowani
Postów: 711
Pomógł: 127
Dołączył: 5.07.2008
Skąd: Łódź

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


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.
Go to the top of the page
+Quote Post
sannin
post
Post #5





Grupa: Zarejestrowani
Postów: 308
Pomógł: 13
Dołączył: 31.10.2008

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


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?
Go to the top of the page
+Quote Post

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: 23.08.2025 - 02:06