Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> dekompresja (gzip) strumienia http
pi_r
post
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 15.06.2005

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


W skrypcie w pewnym momencie muszę pobrać wiekszą ilość danych z serwera http. Aby usprawnić prace skryptu chcę pobierać z serwera skompresowane dane, wysyłam więc w nagłówku :
Kod
Accept-Encoding: gzip

W odpowiedzi otrzymuje:
Kod
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 25150
Content-Type: text/html


Następnie pobieram podaną ilość danych do stringa.
Problem zaczyna się, gdy chce dekodowac otrzymane dane, nie radzi z tym sobie funkcja gzuncompress() generując nastepujący błąd:
Kod
Warning: gzuncompress(): data error in [...]update.php on line 113


Efektów także nie widać gdy czytam za pomoca gzread() bezpośrednio z gniazda (zamiast kodu html pojawiają się losowe znaki).

Ktoś zna może jakieś inne rozwiazanie? A może ja gdzieś robię błąd? ;-)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
dopy
post
Post #2





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 25.07.2005

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


Egh męcze się z tym juz 3 dzień - czuje że robie jakiś głupi błąd... Może ktoś jednak wie co robie źle ?

+ edit:
No nie wierze ze jest to problem nie do rozwiązania :/ Napisałem nawet na 3 zagranicznych forach i wszędzie w moim temacie cisza...

+ rozwiązanie
Po naprawde ciężkich poszukiwaniach, przypadkiem trafiłem na grupy dyskusyjne google, czytając natrafiłem na rozwiązanie:
  1. <?php
  2.  
  3. // my server sends gzipped data if client allows
  4. $url = "www.byteshift.de";
  5.  
  6. function gzdecode($string){
  7. $string = substr($string, 10);
  8. return gzinflate($string);
  9. }
  10.  
  11. function get_gzipped_data($url){
  12. $http_response = '';
  13. $fp = fsockopen($url, 80);
  14. fputs($fp, "GET / HTTP/1.1rn");
  15. fputs($fp, "Accept-Encoding: gziprn");
  16.  
  17. fputs($fp, "Host: $urlrnrn");
  18. while (!feof($fp))
  19. $http_response .= fgets($fp, 128);
  20. fclose($fp);
  21. return $http_response;
  22. }
  23.  
  24. preg_match("/^(.+)r?nr?nw+r?n(.+)$/s",
  25.  get_gzipped_data($url),
  26.  $matches);
  27. $header = $matches[1];
  28. $body  = $matches[2];
  29. $html  = gzdecode($body);
  30. $strlen_uncomp = strlen(file_get_contents("http://$url/"));
  31. $strlen_decomp = strlen($body);
  32.  
  33. echo "
  34. strlen_uncomp: $strlen_uncomp Kb
  35. strlen_decomp: $strlen_decomp Kb
  36. =============================
  37. $html
  38. ";
  39. ?>


W zasadzie pewnie chodzi tutaj głównie o sposób rozdzielenia od nagłówków, ale ważne że działa. To tak dla przyszłych pokoleń.
Pozdrawiam.

Ten post edytował dopy 8.07.2006, 23:59:24
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: 28.12.2025 - 15:34