Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] statystyki wyswietlania zdjec, a FireFox
Forum PHP.pl > Forum > PHP
siutek
Witam,
Chcialem zrobic sobie statystyki wyswietlania zdjec, do tego celu stworzylem skrypt php, ktory wyswietla na ekran odpowednie zdjecie (z uzyciem naglowka header()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;
Quadina
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.
batman
Stawiam na Firebuga lub inną wtyczkę. Przetestuj skrypt na "czystym" Fx.
siutek
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...
Quadina
  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 smile.gif
batman
Skoro nie Firebug, to dodaj buforowanie tak jak to zrobił ~Quadina i sprawdź wtyczką LiveHttpHeaders czy przypadkiem dwa razy nie wysyła Ci requesta.
siutek
Panowie
Poradzilem sobie 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... winksmiley.jpg
Quadina
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 smile.gif
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.