Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] pobieranie pliku w tle + buforowanie, Proszę o radę
Sztef89
post
Post #1





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 6.12.2010

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


Chciałbym zrobić pobieranie plików z innych serwerów, mam kilka wątpliwości:
- Mój obecny serwer ma mało pamięci dlatego chce użyć buforowanego zapisu (kod poniżej), czy takie rozwiązanie jest wydajne, może jest jakieś lepsze ?
- Gdy plik się pobiera wisi wątek w przeglądarce i dopiero po pobraniu pliku skrypt się odwiesza. Zauważyłem, że jak wyłączę przeglądarkę to plik się dalej pobiera. Czy takie działanie skryptu podczas pobierania dużej ilości plików (używając tego samego skryptu) będzie wydajne ? kiedyś czytałem, że lepiej żeby skrypt działał w tle ale nie wiem jak to się robi,
- Chciałbym poniższy skrypt rozbudować o możliwość wznawiania pobierania gdy wystąpi błąd podczas pobierania (max 3 próby). Wiem, że trzeba użyć fseek ale nie za bardzo wiem gdzie i jak w tym kodzie go umieścić.

  1. <?php
  2.  
  3. $url = 'http://strona.pl/plik.zip';
  4. getUrlContents($url);
  5.  
  6. function getUrlContents($url)
  7. {
  8. $url_parsed = parse_url($url);
  9.  
  10. $host = $url_parsed["host"];
  11. if ($url == '' || $host == '') {
  12. return false;
  13. }
  14. $port = 80;
  15. $path = (empty($url_parsed["path"]) ? '/' : $url_parsed["path"]);
  16. $path.= (!empty($url_parsed["query"]) ? '?'.$url_parsed["query"] : '');
  17. $out = "GET $path HTTP/1.0\r\nHost: $host\r\nConnection: Close\r\n\r\n";
  18. $fp = fsockopen($host, $port, $errno, $errstr, 30);
  19. fwrite($fp, $out);
  20. $headers = '';
  21. $content = '';
  22. $buf = '';
  23. $isBody = false;
  24. while (!feof($fp) and !$isBody) {
  25. $buf = fgets($fp, 1024);
  26. if ($buf == "\r\n" ) {$isBody = true;}
  27. else{$headers .= $buf;}
  28. }
  29. $file1 = fopen(basename($url_parsed["path"]), 'w');
  30. $bytes=stream_copy_to_stream($fp,$file1);
  31. fclose($fp);
  32. return $bytes;
  33. }
  34.  
  35. ?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Sztef89
post
Post #2





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 6.12.2010

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


OK, poradziłem sobie z logowaniem + pobieraniem pliku + praca skryptu w tle + wykrywaniem błędów podczas pobierania. Została jedna rzecz - wznawianie pobierania.

Specjalnie pogorszyłem sygnał sieci aby wystąpiły błędy podczas pobierania i w rezultacie pobiera się więcej niż plik powinien zajmować (dałem warunek w while że kończy pracę dopiero gdy plik zajmuje tyle samo co wielkośc pliku pobrana z serwera). Natomiast bez pętli while pobiera się do pewnego miejsca i kończy pracę. Przy silnym sygnale sieci plik pobiera się w całości - bez i z pętlą while, więc jest ok.

Powiedźcie mi czy jak chcę wznowić pobieranie to to w opcji CURLOPT_RANGE podaję bajty liczone od 0 czy od 1 ? trzeba zawsze obie wartości podawać, czyli X-Y czy wartość X wystarczy (czyli od którego bajta ma zacząć pobierać). Czytałem manuala ale nic o tym nie napisali :/ Dałem teraz wartości liczone od zera i pliki są pobierane prawidłowo ale chciałbym być pewien na 100%.

pod koniec whila, zaraz przed klamra zamykającą przypisuje nową wielkość pliku $this->file_new_size = filesize($this->file);, a jak widać po działaniu funkcji wygląda jakby przypisało tylko raz:
Próba 0, zakres: 0 - 6004979, w:3800095
Próba 1, zakres: 3800094 - 6004979, w:3800095
Próba 2, zakres: 3800094 - 6004979, w:3800095
Próba 3, zakres: 3800094 - 6004979, w:3800095
Ilość wszystkich prób: 4
Prędkość: 202643
Rozmiar pobieranego pliku: 6004980
Zapisano: 3800095 - powinno być 12442440

Te pogrubione wartości to ilość pobranych danych po wykonaniu zapytania cURL. Wartość "Zapisano" jest obliczana po wyjściu z while'a i jest znowu źle obliczana :/ Dlaczego funkcja filesize() źle oblicza wielkość pliku ?

Ten post edytował Sztef89 9.03.2012, 17:46:05
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: 10.10.2025 - 06:41