Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] API Piwik i wyswietlanie licznikow odwiedzin
Forum PHP.pl > Forum > PHP
swiezak
Witajcie.
Klient sobie zazyczyl liczniki odwiedzin w oparciu o system PIWIK. Chce, aby ilosci odwiedzin byly wyswietlane w poszczegolnych dzialach serwisu.

Przykladowy kod na wyswietlenie licznika na stronie glownej, w opraciu o API Piwika:
  1. $date = "2013-09-27";
  2. $token_auth = "ccc87a6a74d223e11840d9bb1c73711a";
  3.  
  4. $url = "http://przykladowy_adres.pl/piwik/?module=API&method=VisitsSummary.getVisits&idSite=1&period=range&date=$date,today&format=JSON&token_auth=$token_auth";
  5. $content = file_get_contents($url);
  6. $arr = json_decode($content,true);
  7.  
  8. <div style="text-align: right; font-weight: bold">Ilość odwiedzin: <?php echo $arr['value']; ?></div>


Problem pojawil sie, gdy za pomoca instrukcji switch() umieszczonej w templatce sprawdzam url adresu z dzialow podrzednych (jest ich 36). Po prostu serwis "przykuca" od tych wywolan (zwrotka z numerem 503 raz na jakis czas). Kod licznika jest niemal identyczny, jak ten ktory powyzej przedstawilem. Srednia ilosc uzytkownikow w serwisie w ciagu dnia jest rzedu ok. 300, wiec nie tak znowu duzo. Az sie boje pomyslec, co bedzie sie dzialo, jak uzytkownikow bedzie 1000.

Problem rozw. po czesci w ten sposob, ze uruchomilem do zadan demona CRON i zmuszam go odpalenia skryptu php. Co 5 minut "leci" po wszystkich url'ach z dzialami i zapisuje wartosci poszczegolnych odwiedzin do osobnych plikow tekstowych. Liczba odwiedzin dla strony glownej laduje w pliku: visits.txt, zas dla pozostalych w plikach ze wzorcem visits_nr.txt, gdzie nr to id danego dzialu. Tyle, ze czas wykonywania skryptu wynosi teraz mniej wiecej 25 sekund, czyli sporo jak na hosting na home.pl.

Kod realizujacy powyzsze zagadnienie jest mniej wiecej taki:
  1. function SaveValue($fname, $value) {
  2. if (file_exists("visits/".$fname)) {
  3. $file = fopen("visits/".$fname, "w");
  4. flock($file, 2);
  5. fwrite($file, $value);
  6. flock($file, 3);
  7. fclose($file);
  8. }
  9. }
  10.  
  11. // Aktualności
  12. $url2 = "http://przykladowy_adres.pl/piwik/?module=API&method=Actions.getPageUrl&pageUrl=/aktualnosci&idSite=1&period=range&date=$date,today&format=JSON&token_auth=$token_auth";
  13. $content2 = file_get_contents($url2);
  14. $arr2 = json_decode($content2,true);
  15. SaveValue("visits_2.txt", $arr2[0]['nb_visits']);


W templatce odczytuje wartosc licznika przy uzyciu kodu:
  1. <?php
  2. if (file_exists("visits/visits_2.txt")) {
  3. $file = fopen("visits/visits_2.txt", "r");
  4. flock($file, 1);
  5. $value = fgets($file, 100);
  6. flock($file, 3);
  7. fclose($file);
  8. }
  9. ?>
  10. <div style="text-align: right; font-weight: bold">Ilość odwiedzin: <?php echo $value; ?></div>


Kieruje do Was pytanie: co bedzie wydajniejsze: zapisywanie licznikow odwiedzin do osobncyh plikow tekstowych i ich pozniejsze odczytywanie w zaleznosci od url, czy lepiej to wrzucic do jednego pliku, ktorego struktura bylaby mniej wiecej taka:

Kod
1|10234
2|987
3|13
4|4545


Pozniej mozna by to zapisac do tablicy i w skrypcie php przetwarzac w odpowiedni sposob stringi (zmieniac wartosci licznikow w danych liniach pliku tekstowego). Ale co wtedy z dostepem do pliku, zapisem, odczytem, kiedy mamy do czynienia z 1000 odwiedzajcych?

Prosze o pomoc.
KrisKros123
Jedno pytanie. Chcesz, żeby licznik naliczał po każdym odświeżeniu strony, bo mam w zanadrzu taki kod, czy nabity 1 odwiedzin na IP, czy może resetowanie listy odwiedzonych IP, żeby mogło 1 IP nabijać 1 odwiedzin dziennie, czy w jaki w ogóle chcesz je mieć liczone odwiedziny, bo tak trochę za mało informacji dostałem.

Kod po każdym odświeżeniu strony:
  1. <?php
  2.  
  3. $plik="licz.txt";
  4.  
  5. //odczytujemy aktualną wartość z pliku
  6. $file=fopen($plik, "r");
  7. flock($file, 1);
  8. $liczba=fgets($file, 16);
  9. flock($file, 3);
  10. fclose($file);
  11. $liczba++; //zwiększamy o 1
  12.  
  13. //zapisujemy nową wartość licznika
  14. $file=fopen($plik, "w");
  15. flock($file, 2);
  16. fwrite($file, $liczba++);
  17. flock($file, 3);
  18. fclose($file);
  19.  
  20. ?>

A na stronie wpisujesz <?php include('licz.txt'); ?>



Oczywiście obydwa skrypty są w tym samym pliku tylko include w dowolnym miejscu na stronie

Ale może Ci chodzi o inny sposób wtedy przepraszam.
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-2024 Invision Power Services, Inc.