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%)
-----


to jest PHP a nie js itd (IMG:style_emoticons/default/biggrin.gif)
CRON służy do automatycznego odpalania co pewien okres to mi nic nie da... zresztą błąd jest gdzie indziej jeden już znalazłem:
funkcja filesize() cachuje dane więc kolejne je odpalenia dają ten sam wynik i należało ten cache czyścic po każdym jej wywołaniu funkcją clearstatcache();

Teraz jak skrypt odpalam to rozmiar pliku jest zawsze prawidłowo odczytany ale cały czas pobiera się za dużo tak jakby te przedziały które ustawiam opcją CURLOPT_RANGE nie działały:

Próba 0, zakres: 0 - 6004979, zapisano:3518315
Próba 1, zakres: 3518314 - 6004979, zapisano:7242490
Ilość wszystkich prób: 2
Prędkość: 180443
Rozmiar pliku: 6004980
Zapisano: 7242490

Oto kawałek kodu skryptu, klasy FileWriteHandler nie zamieszczam bo tam błędu nie ma, plik się dobrze zapisuje - funkcja sprawdzona. Błąd musi być w kodzie poniżej i czuje, że w parametrach cURL'a - CURLOPT_RANGE?? hymm

//EDIT
Już sobie poradziłem, odpowiedź znalazłem na zagranicznych forach. cURL'owi należy podać tylko wielkość pliku w bajtach i to mu wystarczy aby plik dokończyć. Czyli nalezy zrobic taki warunek:


  1. #Zapis pliku
  2. while($this->file_new_size != $this->file_size){
  3. //>>>>tutaj ustawienia curla<<<<
  4.  
  5. if(file_exists($this->file)){
  6. curl_setopt($c, CURLOPT_RANGE, $this->file_new_size."-");
  7. }
  8. curl_exec($c);
  9. $this->file_new_size = filesize($this->file);
  10.  
  11. $i++;
  12.  
  13. //Warunek kiedy ma wyjść z while'a
  14. if(($this->file_new_size > $this->file_size)||$i>3)break;
  15. }
  16.  
  17. echo "<br>Ilość wszystkich prób: ".$i;
  18. echo "<br>Prędkość: ".curl_getinfo($c,CURLINFO_SPEED_DOWNLOAD);
  19. echo "<br>Rozmiar: ".$this->file_size;
  20. echo "<br>Zapisano: ".filesize($this->file);
  21. echo "<br>Ścieżka: ".$this->file;


Ten post edytował Sztef89 9.03.2012, 21:10:51
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 - 16:38