Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Licznik pobrań pliku
Forum PHP.pl > Forum > Przedszkole
Demoneos
Napisałem prosty liczniki pobrań pliku - kiedy użytkownik kliknie w link do pobrania pliki uruchamiana jest ta strona:
  1. Pobierz z pliku tekstowego liczbe dotychczasowych pobrań
  2. Zwieksz liczbe dotychczasowych pobran o 1
  3. Zapisz ta zwiekszona liczbe do tego pliku tekstowego
  4. header('Content-type: text/plain');
  5. header('Content-Disposition: attachment; filename="program.rar"');
  6. readfile('program.rar');

Czyli najpierw aktualizuję liczbę ściągnięć przechowywaną w pliku tekstowym, a później użytkownikowi wyświetlane jest okno przeglądarki z wyborem czy chce ściągnąć plik, czy nie. I to działa, tylko problem w tym, że liczba ściągnięć będzie powiększona zawsze, niezależnie czy użytkownik kliknie w oknie przeglądarki OK, czy Anuluj. Czy da się wobec tego jakoś wykryć, czy użytkownik kliknął w OK, czy w Anuluj (i w zależności od tego zwiększać w pliku tekstowym liczbę ściągnięć lub nie zwiększać)?
Uriziel01
Proszę bardzo, mam nadzieje że implementacja nie sprawi zbyt wielu problemów:
http://bytes.com/topic/php/answers/551302-...leted-cancelled
Demoneos
Tyle że to pozwoli chyba wykryć, czy ściąganie pliku było przerwane, a ja mam tak mały plik do ściągnięcia, że nawet nie ma możliwości przerwać ściągania, bo ściąga się on natychmiastowo smile.gif
Chodzi mi o coś trochę innego - żeby wykryć - zanim użytkownik rozpoczął ściąganie - czy kliknął on w przycisk OK, czy Anuluj.
Czy wykrycie tego jest w ogóle możliwe w PHP?
wNogachSpisz
Nawiązując do odpowiedzi kolegi "Uriziel01"
idąc za linkiem, w drugim poście poczytamy:

Cytat
You could check the byte count in the web server log to see if the
whole file was transferred.

Zaiste, jest to jakiś pomysł.
Nie wiem czy ilość bajtów w logu apache będzie uzględniała przerwane połączenie, trzebaby sprawdzić. Problemem może być fakt, że plik z logiem trzeba przetworzyć aby wyciągnąc z niego to co nas interesuje, to może się okazać zbyt zasobochłonne, trzeba na to uwżać, któregoś dnia może powstać w tym miejscu wąskie gardło.

Cytat
In PHP, you could also do this by checking connection_aborted() after
sending the file. For example:
(...)
ignore_user_abort(true); // Don't end if the connection breaks

Bzdura, nie spotkałem się z serwerem który miałby problem z ignore_user_abort(true);
ta funkcja zawsze działa prawidłowo (przynajmniej dla mnie).

Nie ma dobrej odpowiedzi na tamtym forum.
Ja to robie tak (działa bez zgrzytów od lat na wszystkich serwerach)

  1.  
  2. function shutdown_function() {
  3. global $fp, $bytes;
  4. logs($bytes); // w dużym urposzczeniu, zapisujemy rzeczywistą ilość przesłanych bajtów
  5. @fclose($fp);
  6. }
  7. register_shutdown_function('shutdown_function');
  8.  
  9. header('...');
  10. $fp = fopen('...'); // plik do wysłania..
  11. $buffer = 8196;
  12. $bytes = 0;
  13. while ( ! feof($fp)) {
  14. echo fread($fp, $buffer);
  15. $bytes += $buffer;
  16. }
  17. fclose($fp);
Demoneos
wNogachSpisz, czy Twój skrypt zadziała również, jeżeli użytkownik kliknie Anuluj w oknie zapisywania przeglądarki zanim jeszcze plik zaczął się pobierać?
wNogachSpisz
Cytat(Demoneos @ 13.12.2011, 15:51:19 ) *
wNogachSpisz, czy Twój skrypt zadziała również, jeżeli użytkownik kliknie Anuluj w oknie zapisywania przeglądarki zanim jeszcze plik zaczął się pobierać?

To zazwyczaj działa w ten sposób, że przeglądarka rozpoczyna pobieranie jeszcze zanim wybierzesz lokalizacje dla pliku.
Pobieranie nie następuje w chwili gdy użytkownik wybierze docelową lokalizacje pobieranego pliku.
Pobieranie rozpoczyna się w chwili kiedy przeglądarka nawiąże połączenie z serwerem www, a to dzieje się natychmiast po kliknięciu w link.
Odpowiedź brzmi Tak.

Odpowiedź nie brzmi Tak.... ;p
Nie da się przy pomocy php wykryć czy użytkownik wybrał anuluj czy zapisz.
Nie da się też tego zrobić za pomocą JavaScript.
Demoneos
A w czymkolwiek innym? smile.gif

W sumie więc w moim przypadku wystarczy mi to co napisałem w pierwszym poście. Pytanie tylko, czy plik tekstowy będzie tutaj odpowiednim miejscem przechowywania liczby ściągnięć? Czy nie będzie problemu jeżeli kilka osób naraz ściągnie i nastąpi kilka prób jednoczesnego zapisu do pliku tekestowe?
wNogachSpisz
flock()
Demoneos
To może taki licznik zrobić lepiej w relacyjne bazie danych? Wiem, że to będzie tylko jeden wiersz w tabeli (zawierający liczbę określającą ilość ściągnięć programu), ale mimo wszystko taka baza będzie będzie dobra jeżeli w przyszłości chciałbym dać możliwość ściągania programu w innym formacie (np. exe i jar) - wówczas to już będą dwa wiersze, więc lepiej chyba zapisać to w relacyjnej bazie danych niż tekstowym pliku?
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.