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
Sephirus
post
Post #2





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

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


Jeszcze raz (IMG:style_emoticons/default/tongue.gif)

ad 1. Tu mi chodzilo o to że możesz to sobie uprościć tylko (IMG:style_emoticons/default/wink.gif)

ad 2. (IMG:style_emoticons/default/wink.gif)

ad 3. W praktyce jest tak jak mówisz o ile serwer z którego pobierasz obsługuje pobieranie "kawałków" (CONTENT-RANGE - Http). Jeśli tak to po pobraniu sprawdzasz czy pobrane bajty równają się założonym (pobranym z nagłówka Content-Type poprzez Curl_getinfo) - jeśli się okażę że tak nie jest możesz spróbować pobierać od nowa lub wywołać plik od miejsca w którym się skończyło - właśnie poprzez odpowiednie ustawienie content-range w nagłówkach - jest o tym sporo w Internecie.

Co do dodatkowego pytania to nie jestem pewny więc musiałbyś to sprawdzić. Dodatkowo też zamiast CURL i FSOCKOPEN możesz pop orstu użyć FOPEN (IMG:style_emoticons/default/wink.gif) co może w niektórych aspektach być wygodniejsze a jest podobne do fsockopen (IMG:style_emoticons/default/wink.gif) Tam możesz dać odpowiedni nagłówek/nagłówki poprzez tzw context jako ostatni argument fopen (IMG:style_emoticons/default/wink.gif) Tu masz manual: stream_context_create.

Ze względu na to że masz mało pamieci - przetestowałbym na twoim miejscu wszystkie 3 opcje i wybrał najbardziej wydajną - na pewno curl sam w sobie dorzuca coś od siebie ale lepiej to sprawdzić (IMG:style_emoticons/default/smile.gif)

Zawsze też możesz ewentualnie posłużyć się komendami linuxa - wget itd... to powinno też nieźle działać (IMG:style_emoticons/default/wink.gif)
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: 12.10.2025 - 07:53