Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kopiowanie pliku generowanego w php "w locie"
Forum PHP.pl > Forum > PHP
maniutek08
Witam

mam problem ze skopiowaniem pliku xml, który jest generowany "na żądanie" wielkość ok 17MB. Robię to standardowo przez polecenie copy(), i niestety wynik jest losowy : raz się uda skopiować a raz wywala błąd :
  1. [function.copy]: failed to open stream: HTTP request failed! in



Zrobiłem sobie raport - tak to się przedstawia w ciągu dwóch godziny - skrypt wywoływany co 5 minut :
  1. 2015-06-16 14:48:50 - HTTP Filed!
  2. 2015-06-16 14:50:52 - OK!
  3. 2015-06-16 14:55:01 - HTTP Filed!
  4. 2015-06-16 15:00:01 - HTTP Filed!
  5. 2015-06-16 15:05:01 - HTTP Filed!
  6. 2015-06-16 15:10:01 - HTTP Filed!
  7. 2015-06-16 15:15:02 - HTTP Filed!
  8. 2015-06-16 15:20:01 - OK!
  9. 2015-06-16 15:25:01 - HTTP Filed!
  10. 2015-06-16 15:30:01 - OK!
  11. 2015-06-16 15:35:01 - OK!
  12. 2015-06-16 15:40:01 - HTTP Filed!
  13. 2015-06-16 15:45:01 - HTTP Filed!
  14. 2015-06-16 15:50:01 - HTTP Filed!
  15. 2015-06-16 15:55:01 - OK!
  16. 2015-06-16 16:00:01 - OK!
  17. 2015-06-16 16:05:01 - OK!
  18. 2015-06-16 16:10:01 - HTTP Filed!
  19. 2015-06-16 16:15:02 - OK!
  20. 2015-06-16 16:20:01 - HTTP Filed!
  21. 2015-06-16 16:25:01 - HTTP Filed!
  22. 2015-06-16 16:30:01 - OK!
  23. 2015-06-16 16:35:01 - OK!
  24. 2015-06-16 16:40:01 - HTTP Filed!
  25. 2015-06-16 16:45:01 - OK!
  26. 2015-06-16 16:50:01 - OK!
  27. 2015-06-16 16:55:01 - OK!
  28. 2015-06-16 17:00:02 - HTTP Filed!


tomxx
Podaj kod, chyba że chcesz, żebyśmy Ci powróżyli smile.gif
maniutek08
Tak jak pisałem tylko polecenie copy :
  1. if(copy($source, '410.xml')) file_put_contents('raport.txt', $time." - OK!\n", FILE_APPEND);
  2. else file_put_contents('raport.txt', $time." - HTTP Filed!\n", FILE_APPEND);


Sory ale linku $source nie mogę podać, ponieważ nie chcę żeby google to indeksował, 2. wolałbym żeby klient o tym się nie dowiedział smile.gif

aktualny raport (totalna losowość ;/):
  1. 2015-06-16 14:48:50 - HTTP Filed!
  2. 2015-06-16 14:50:52 - OK!
  3. 2015-06-16 14:55:01 - HTTP Filed!
  4. 2015-06-16 15:00:01 - HTTP Filed!
  5. 2015-06-16 15:05:01 - HTTP Filed!
  6. 2015-06-16 15:10:01 - HTTP Filed!
  7. 2015-06-16 15:15:02 - HTTP Filed!
  8. 2015-06-16 15:20:01 - OK!
  9. 2015-06-16 15:25:01 - HTTP Filed!
  10. 2015-06-16 15:30:01 - OK!
  11. 2015-06-16 15:35:01 - OK!
  12. 2015-06-16 15:40:01 - HTTP Filed!
  13. 2015-06-16 15:45:01 - HTTP Filed!
  14. 2015-06-16 15:50:01 - HTTP Filed!
  15. 2015-06-16 15:55:01 - OK!
  16. 2015-06-16 16:00:01 - OK!
  17. 2015-06-16 16:05:01 - OK!
  18. 2015-06-16 16:10:01 - HTTP Filed!
  19. 2015-06-16 16:15:02 - OK!
  20. 2015-06-16 16:20:01 - HTTP Filed!
  21. 2015-06-16 16:25:01 - HTTP Filed!
  22. 2015-06-16 16:30:01 - OK!
  23. 2015-06-16 16:35:01 - OK!
  24. 2015-06-16 16:40:01 - HTTP Filed!
  25. 2015-06-16 16:45:01 - OK!
  26. 2015-06-16 16:50:01 - OK!
  27. 2015-06-16 16:55:01 - OK!
  28. 2015-06-16 17:00:02 - HTTP Filed!
  29. 2015-06-16 17:05:02 - OK!
  30. 2015-06-16 17:10:01 - HTTP Filed!
  31. 2015-06-16 17:15:01 - OK!
  32. 2015-06-16 17:20:02 - OK!
  33. 2015-06-16 17:25:01 - OK!
  34. 2015-06-16 17:30:01 - OK!
  35. 2015-06-16 17:35:01 - HTTP Filed!
  36. 2015-06-16 17:40:01 - OK!
  37. 2015-06-16 17:45:01 - OK!
  38. 2015-06-16 17:50:01 - HTTP Filed!
  39. 2015-06-16 17:55:02 - OK!
  40. 2015-06-16 18:00:01 - OK!
  41. 2015-06-16 18:05:01 - OK!
  42. 2015-06-16 18:10:01 - HTTP Filed!
  43. 2015-06-16 18:15:01 - OK!
  44. 2015-06-16 18:20:01 - OK!
  45. 2015-06-16 18:25:02 - OK!
  46. 2015-06-16 18:30:01 - OK!
  47. 2015-06-16 18:35:01 - OK!
  48. 2015-06-16 18:40:02 - HTTP Filed!
  49. 2015-06-16 18:45:01 - OK!
  50. 2015-06-16 18:50:01 - OK!
  51. 2015-06-16 18:55:01 - HTTP Filed!
  52. 2015-06-16 19:00:01 - OK!
  53. 2015-06-16 19:05:01 - OK!
  54. 2015-06-16 19:10:02 - OK!
  55. 2015-06-16 19:15:01 - OK!
  56. 2015-06-16 19:20:02 - HTTP Filed!
  57. 2015-06-16 19:25:01 - OK!
  58. 2015-06-16 19:30:01 - OK!
  59. 2015-06-16 19:35:01 - OK!
  60. 2015-06-16 19:40:01 - OK!
  61. 2015-06-16 19:45:01 - OK!
  62. 2015-06-16 19:50:01 - HTTP Filed!
  63. 2015-06-16 19:55:01 - OK!
  64. 2015-06-16 20:00:01 - HTTP Filed!
  65. 2015-06-16 20:05:01 - HTTP Filed!
  66. 2015-06-16 20:10:01 - OK!
  67. 2015-06-16 20:15:01 - OK!
  68. 2015-06-16 20:20:02 - OK!
markuz
Może kopiuj "po trochu". Spróbuj tak: http://stackoverflow.com/questions/6564643...ver-2-gb-in-php
maniutek08
pierwsza funkcja z powyższego wątku - to samo : failed to open stream: HTTP request failed!
johny_s
może serwer z którego pobierasz dane po prostu nie wyrabia
maniutek08
Też to zasugerowałem - tym bardziej że w ten sposób kopiuje o wiele większe pliki. A taką dostałem odpowiedź od informatyka :

Plik jest dostepny poprzez protokuł http takze nie ma zadnych zabezpieczeń zeby go nie sciagac. Plik jest generowany na rzadanie takze byc moze z tego wynika problem ze "skopiowaniem" go. Sam proces wytwarzania pliku trwa dobre ponad 10 sekund takze niezaleznie od technologii sciagania, proponowałbym zastosować taką metodę, aby ewentualny czas generowania jak i samo przesylanie pliku rzędu 17MB miało możliwość powodzenia.
johny_s
curl i duży timeout
maniutek08
znalazłem sobie taką funkcyjkę :

  1. function getUrlContents($url)
  2. {
  3. $url_parsed = parse_url($url);
  4.  
  5. $host = $url_parsed["host"];
  6. if ($url == '' || $host == '') {
  7. return false;
  8. }
  9. $port = 80;
  10. $path = (empty($url_parsed["path"]) ? '/' : $url_parsed["path"]);
  11. $path.= (!empty($url_parsed["query"]) ? '?'.$url_parsed["query"] : '');
  12. $out = "GET $path HTTP/1.0\r\nHost: $host\r\nConnection: Close\r\n\r\n";
  13. $fp = fsockopen($host, $port, $errno, $errstr, 30);
  14. fwrite($fp, $out);
  15. $headers = '';
  16. $content = '';
  17. $buf = '';
  18. $isBody = false;
  19. while (!feof($fp) and !$isBody) {
  20. $buf = fgets($fp, 1024);
  21. if ($buf == "\r\n" ) {$isBody = true;}
  22. else{$headers .= $buf;}
  23. }
  24. $file1 = fopen(basename($url_parsed["path"]), 'w');
  25. $bytes=stream_copy_to_stream($fp,$file1);
  26. fclose($fp);
  27. return $bytes;
  28. }


póki co raport jesk OK! :

  1. 2015-06-16 22:15:01 - OK!
  2. 2015-06-16 22:20:02 - OK!
  3. 2015-06-16 22:25:01 - OK!
  4. 2015-06-16 22:30:01 - OK!
  5. 2015-06-16 22:35:02 - OK!
  6. 2015-06-16 22:40:01 - OK!
  7. 2015-06-16 22:45:01 - OK!
  8. 2015-06-16 22:50:01 - OK!


hm.. w czym ona jest lepsza od copy() czy file_get_contents?
maly_swd
Chodzi o to, że twój skrypt ("copy") czeka chwile i nie dostaje danych (zbyt długo generuje się tam XML), po czym uznaje że jest błąd.

Ogólnie chodzi o timeOut, w fsockopen podajesz 30 sekund.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.