Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] statystyki wyswietlania zdjec, a FireFox, FF pobiera dwa razy
siutek
post
Post #1





Grupa: Zarejestrowani
Postów: 173
Pomógł: 1
Dołączył: 26.10.2005
Skąd: Toruń

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


Witam,
Chcialem zrobic sobie statystyki wyswietlania zdjec, do tego celu stworzylem skrypt php, ktory wyswietla na ekran odpowednie zdjecie (z uzyciem naglowka header()(IMG:style_emoticons/default/winksmiley.jpg)
W tym samym pliku kazdorazowo zapisuje do bazy id fotki i dokladna date jej wyswietlenia.

Niestety zauwazylem ze FF pobiera zdjecia dwukrotnie! w odstepie 2-4 sekund, w ten posob jedno wyswietlenie generuje mi dwa wpisy do bazy. Tego problemu nie ma np w Chromie...
Jak sobie z tym poradzic? jest mozliwosc zabezpieczenia sie? Nie chcialbym blokowac drugiego wpisu na IP :/

kod:
  1. header('Content-type: image/jpeg');
  2.  
  3. date_default_timezone_set('Europe/Warsaw');
  4.  
  5. include "./config.php";
  6.  
  7. $fotaId = base64_decode($_GET["fi"]);
  8.  
  9. $fotaArr = getRecord("gallery",$fotaId);
  10. $usrArr = getRecord("users",$fotaArr["usrId"]);
  11. queryInsert("imgStats",array("img_id"=>$fotaId,"date"=>date("U"),"user_id"=>$fotaArr["usrId"]));
  12.  
  13. $link = './usersFiles/'.$usrArr["login"].'/'.$fotaArr["fileName"];
  14.  
  15. $fota = file_get_contents($link);
  16.  
  17. echo $fota;
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
Quadina
post
Post #2





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

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


A wyświetlasz te obrazki jakimś javascriptem, czy normalnie w HTML? Możesz wysłać ten fragmencik kodu? Ogólnie po za brakiem optymalizacji w kilku drobnych miejscach to Twój skrypt jest ok i na pewno będzie zliczał tylko raz.
Go to the top of the page
+Quote Post
batman
post
Post #3





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Stawiam na Firebuga lub inną wtyczkę. Przetestuj skrypt na "czystym" Fx.
Go to the top of the page
+Quote Post
siutek
post
Post #4





Grupa: Zarejestrowani
Postów: 173
Pomógł: 1
Dołączył: 26.10.2005
Skąd: Toruń

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


nie wyswietlam obrazka ani JS, ani HTMLem. wyswietlam jak normalną fotke, tak jakbys w pasku adresu w przegladarce wpisala http://www.adresserwera.pl/zdjecie.jpg
Ten kod jakby symulowal fote, w celu zliczania statystyk.

Ps. mozesz wskazac miejsca do poprawy w kontekscie optymalizacji, o ktorej mowilas?

edit: powylaczalem wszystkie wtyczki :/ zresetowalem FF i dalej to samo...

Ten post edytował siutek 7.12.2010, 15:44:34
Go to the top of the page
+Quote Post
Quadina
post
Post #5





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

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


  1. // to jest na pewno potrzebne?
  2. //date_default_timezone_set('Europe/Warsaw');
  3.  
  4. include "./config.php";
  5.  
  6. $fotaId = base64_decode($_GET["fi"]);
  7.  
  8. $fotaArr = getRecord("gallery",$fotaId);
  9. $usrArr = getRecord("users",$fotaArr["usrId"]);
  10. queryInsert("imgStats",array("img_id"=>$fotaId,"date"=>date("U"),"user_id"=>$fotaArr["usrId"]));
  11.  
  12. $link = './usersFiles/'.$usrArr["login"].'/'.$fotaArr["fileName"];
  13.  
  14. // przewidujemy, ze pliku niestety nie będzie
  15. if(is_file($link){
  16. // wysylamy caly zestaw nagłówków - być moze FF nie jest pewna, czy dostała wszystko i wysyła żądanie jeszcze raz.
  17. header('Content-type: image/jpeg');
  18. header('Content-Length: ' . filesize($link));
  19.  
  20. // czyścimy context w razie jakichś niespodziewanych błędów. error_reporting nie działa na niektóre sytuacje.
  21. flush();
  22.  
  23. // drukujemy od razu plik, nie przepisując jej do żądnej zmiennej
  24. readfile($link);
  25. } else {
  26. echo "ERROR: brak pliku $link";
  27. }


Tak jak napisałem w komentarzu w kodzie, FF może nie być pewne, czy pobrał całość, skoro nie wie ile tych danych ma dostać. Dodałem obsługę błędu, gdy pliku nie ma, możesz tam sobie wrzucić coś na maila, albo zapisywać błędy do jakiegoś pliku.

  1. $fotaArr = getRecord("gallery",$fotaId);
  2. $usrArr = getRecord("users",$fotaArr["usrId"]);

Czy nie jesteś w stanie tego wyciągnąć jednym zapytaniem z joinem?

P.S. Czepialstwo na średnim poziomie, bardziej chciałem pokazać, że można inaczej, niż że masz coś realnie źle (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
batman
post
Post #6





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Skoro nie Firebug, to dodaj buforowanie tak jak to zrobił ~Quadina i sprawdź wtyczką LiveHttpHeaders czy przypadkiem dwa razy nie wysyła Ci requesta.
Go to the top of the page
+Quote Post
siutek
post
Post #7





Grupa: Zarejestrowani
Postów: 173
Pomógł: 1
Dołączył: 26.10.2005
Skąd: Toruń

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


Panowie
Poradzilem sobie (IMG:style_emoticons/default/smile.gif) doszedlem do wniosku, że przeglądarka pobiera podwójnie aby wyswietlic na ekranie i wrzucic do cache'a.

Umiescilem zatem dodatkowy naglowek: header("Cache-Control: no-cache");

Wiem ze teraz za kazdym razem zdjecie bedzie pobierane z sieci, ale inaczej nie wiem jak to rozwiazac... (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Quadina
post
Post #8





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

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


Rozwiązanie jest o tyle dobre, że teraz na pewno będzie Ci zliczać za każdym razem gdy zdjęcie zostanie wyświetlone. A chyba o to chodziło (IMG:style_emoticons/default/smile.gif)
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.08.2025 - 13:52