Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [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
 
Start new topic
Odpowiedzi
wNogachSpisz
post
Post #2





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

Posty w temacie


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: 26.12.2025 - 10:14