Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Download pliku - nieznany błąd przerywający pobieranie pliku
Forum PHP.pl > Forum > PHP
Michael2318
Witam!

Pobieram sobie plik z zewnętrznego serwera za pomocą:

  1. $context = stream_context_create($opts);
  2. $handle = fopen($dwn, "r", false, $context);
  3. if ($handle) {
  4. while (($buffer = fread($handle, 4096)) !== false)
  5. {
  6. echo $buffer;
  7. }
  8. fclose($handle);
  9. }


Oczywiście mógłbym to zrobić za pomocą file_get_contents(), ale gdy plik waży grubo ponad 1GB to skrypt się po prostu zakręci i dostaniemy mniej więcej coś takiego:

Cytat
Allowed memory size of 134217728 (..)


Skrypt powyżej zapobiega temu i w efekcie download dużych plików przebiega bezproblemowo, jednak do czasu. Przy ściągnięciu ponad 100MB danych, przeglądarka zwraca mi błąd: "Pobieranie pliku nie powiodło się". I tutaj właśnie nie potrafię znaleźć przyczyny tego zjawiska. Polecono mi użycie ob_fluch / flush, aby wyczyścić bufor, jednak to nic nie dało.

Dodatkowo w logach wyświetlane są takie błędy:
Cytat
[Sat Jan 17 12:54:09 2015] [warn] [client 178.] (104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server
[Sat Jan 17 12:54:09 2015] [warn] [client 178.] (104)Connection reset by peer: mod_fcgid: ap_pass_brigade failed in handle_request_ipc function
[Sat Jan 17 12:54:09 2015] [error] [client 178.] File does not exist: /home/name/domains/name.yyy.pl/public_html/500.shtml


Ma ktoś jakiś pomysł jak dostać się do jakiegoś komunikatu/błędu który powie coś więcej, abym wiedział gdzie szukać problemu?
Crozin
Dlaczego po prostu nie skorzystasz z readfile? Robi dokładnie to czego potrzebujesz.
Michael2318
Tylko ja pobieram plik z zewnętrznego serwera. Pierw łączę się z curlem i loguję na moje konto w pewnym serwisie, a potem chcę pobrać plik na swój komputer, tyle że, aby pobrać ten plik - muszę być zalogowany. Tak więc pobieram ciastka i wtedy inicjuję download. No i nie chcę pobierać pliku na mój serwer hostingowy tylko bezpośrednio ze strony do mnie na komputer.
Crozin
Ale kiedy readfile podobnie jak fopen akceptuje coś takiego jak "kontekst" (4. parametr fopen) - na dobrą sprawę robi dokładnie to co Twój kod.
Michael2318
Wypróbowałem to rozwiązanie z readfile. Kod wygląda tak:

  1. readfile($dwn, false, $context);

gdzie $dwn to link bezpośredni do pliku. Niestety skrypt się zamula i operacja trwa bardzo długo, a finalnie i tak dostaję plik z poprawną nazwą pliku, aczkolwiek waży on 20B i nic nie zawiera (pusty plik, który ma przypisaną nazwę i rozszerzenie, tyle).
Crozin
Możesz pokazać kompletny SSCCE
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.