Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Licznik pobrań pliku
Demoneos
post
Post #1





Grupa: Zarejestrowani
Postów: 149
Pomógł: 0
Dołączył: 26.02.2008

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


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ć)?

Ten post edytował Demoneos 13.12.2011, 13:46:13
Go to the top of the page
+Quote Post
Uriziel01
post
Post #2





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

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


Proszę bardzo, mam nadzieje że implementacja nie sprawi zbyt wielu problemów:
http://bytes.com/topic/php/answers/551302-...leted-cancelled

Ten post edytował Uriziel01 13.12.2011, 13:43:41
Go to the top of the page
+Quote Post
Demoneos
post
Post #3





Grupa: Zarejestrowani
Postów: 149
Pomógł: 0
Dołączył: 26.02.2008

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


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 (IMG:style_emoticons/default/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?

Ten post edytował Demoneos 13.12.2011, 14:40:51
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #4





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


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


Ten post edytował wNogachSpisz 13.12.2011, 15:05:59
Go to the top of the page
+Quote Post
Demoneos
post
Post #5





Grupa: Zarejestrowani
Postów: 149
Pomógł: 0
Dołączył: 26.02.2008

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


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ć?
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #6





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


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.

Ten post edytował wNogachSpisz 14.12.2011, 11:28:30
Go to the top of the page
+Quote Post
Demoneos
post
Post #7





Grupa: Zarejestrowani
Postów: 149
Pomógł: 0
Dołączył: 26.02.2008

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


A w czymkolwiek innym? (IMG:style_emoticons/default/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?

Ten post edytował Demoneos 14.12.2011, 14:22:33
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #8





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


flock()
Go to the top of the page
+Quote Post
Demoneos
post
Post #9





Grupa: Zarejestrowani
Postów: 149
Pomógł: 0
Dołączył: 26.02.2008

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


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?
Go to the top of the page
+Quote Post

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: 23.12.2025 - 07:02