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


ad 1. Co do wydajności to cięższa sprawa - wszystko zależy od ustawień nie tylko PHP ale i serwera, wielkości buforów i prędkości połączenie - im szybsze tym gorzej (szybciej docierają dane i zapychają pamięć) - może kod zamienić na CURL z CURLOPT_WRITEFUNCTION i spróbować z tego - to duże ułatwienie i łatwo można kontrolować pobieranie i zapisywanie pliku.

ad 2. Zapoznaj się z register_shutdown_function oraz ignore_user_abort ich odpowiednia kombinacja powinna pozwolić Ci na odpalenie skryptu w przeglądarce, zwrócenie przez niego wyniku i dalszej pracy. Pamiętaj tylko o zamykaniu sesji - aby sesja nie wisiała.

ad 3. Jeśli użyłbyś CURL'a to przy pomocy WRITE_FUNCTION i CURL_GETINFO (z tego co pamiętam) łatwo można wykryć czy plik pobrał się dobrze i zadziałać odpowiednio (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
Sztef89
post
Post #3





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

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


Cytat(Sephirus @ 28.02.2012, 14:33:25 ) *
ad 1. Co do wydajności to cięższa sprawa - wszystko zależy od ustawień nie tylko PHP ale i serwera, wielkości buforów i prędkości połączenie - im szybsze tym gorzej (szybciej docierają dane i zapychają pamięć) - może kod zamienić na CURL z CURLOPT_WRITEFUNCTION i spróbować z tego - to duże ułatwienie i łatwo można kontrolować pobieranie i zapisywanie pliku.

ad 2. Zapoznaj się z register_shutdown_function oraz ignore_user_abort ich odpowiednia kombinacja powinna pozwolić Ci na odpalenie skryptu w przeglądarce, zwrócenie przez niego wyniku i dalszej pracy. Pamiętaj tylko o zamykaniu sesji - aby sesja nie wisiała.

ad 3. Jeśli użyłbyś CURL'a to przy pomocy WRITE_FUNCTION i CURL_GETINFO (z tego co pamiętam) łatwo można wykryć czy plik pobrał się dobrze i zadziałać odpowiednio (IMG:style_emoticons/default/wink.gif)


1. Coś czułem ze ta funkcja nie jest najlepsza (IMG:style_emoticons/default/smile.gif) Ale testowałem i działa bardzo dobrze, pobrałem nią paręnaście GB i nie było żadnych problemów tylko niepotrzebnie skrypt wisi w przeglądarce w trakcie pobierania

2. Ok zapoznam się - mam nadzieje że dam rade, dzięki ! (IMG:style_emoticons/default/smile.gif)

3. Czyli najlepszym rozwiązaniem byłoby użycie cURLa do pobierania pliku ? Robię w cURL logowanie aby pobrać plik więc by było niemal 2 w jednym: logowanie i pobieranie przez cURL. Czyli dzięki tym dwóm funkcjom WRITE_FUNCTION i CURL_GETINFO można sprawdzić czy dobrze się pobrał plik, a jeśli nie to wznowić pobieranie - od tego miejsca co się zdążyło pobrać ?

A jeszcze jedno: czy curl ładuje pobierany plik do pamięci czy na dysk serwera ? To jest bardzo dla mnie ważne bo pamięci serwer mój ma bardzo mało, a transfer ok 5MB/s na pobieranie

Ten post edytował Sztef89 28.02.2012, 14:53:15
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 9.10.2025 - 05:24