Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]zooptymalizowanie skryptu
bialko0019
post
Post #1





Grupa: Zarejestrowani
Postów: 294
Pomógł: 4
Dołączył: 19.12.2008

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


Witam. Dosyć niedawno zacząłem odkrywać programowanie obiektowe, więc mam pytanie. Stworzyłem skrypt, który wyciąga z bazy danych jednym zapytaniem dzisiaj, wczoraj zalogowanych userów, oraz dzisiaj i wczoraj zarejestrowanych. Wszystko ładnie działa, jednak gdybym tworzył strukturalnie, wydaje mi się było by mniej kodu - tyle, że więcej zapytań do bazy danych - a chciałbym wszystko zminimalizować (IMG:style_emoticons/default/winksmiley.jpg) To w kwestii nauki.

Napisałem tak ( pewnie chaotycznie (IMG:style_emoticons/default/winksmiley.jpg) ); :

  1. <?php
  2.  
  3. // ile osób w bazie
  4. // ile dzisiaj zalogowanych
  5. // ile wczoraj zalogowanych
  6. // ile dzisiaj rejestrowanych
  7. // ile wczoraj zarejestrowanych
  8.  
  9. class statystyki{
  10.  
  11. function osoby(){
  12.  
  13. $zapytanie = mysql_query("SELECT * FROM uzytkownicy WHERE login NOT LIKE''");
  14. $zawartosc = mysql_num_rows($zapytanie);
  15. $this->ogolem=$zawartosc;
  16. $i = 0;
  17. while($dana=mysql_fetch_array($zapytanie)){
  18.  
  19. $osoby[$i] = new statystyki;
  20. $osoby[$i] -> zalogowany = $dana['ostatnie_logowanie'];
  21. $osoby[$i] -> rejestracja = $dana['rejestracja'];
  22.  
  23. $i++;
  24. }
  25. $dzisiajz = 0;
  26. $dzisiajr = 0;
  27. $wczorajz = 0;
  28. $wczorajr = 0;
  29. foreach($osoby as $id => $statystyki){
  30.  
  31. if($statystyki -> zalogowany >= date('Y-m-d 00:00:00'))
  32. {
  33. $dzisiajz++;
  34. }
  35.  
  36. if($statystyki -> rejestracja >= date('Y-m-d 00:00:00'))
  37. {
  38. $dzisiajr++;
  39. }
  40.  
  41. if($statystyki -> zalogowany >= date('Y-m-d 00:00:00', strtotime("-1 day")) && $statystyki -> zalogowany < date('Y-m-d 00:00:00'))
  42. {
  43. $wczorajz++;
  44. }
  45.  
  46. if($statystyki -> rejestracja >= date('Y-m-d 00:00:00', strtotime("-1 day")) && $statystyki -> rejestracja < date('Y-m-d 00:00:00'))
  47. {
  48. $wczorajr++;
  49. }
  50.  
  51.  
  52. }
  53. $this->dzisiaj=$dzisiajz;
  54. $this->dzisiajr=$dzisiajr;
  55. $this->wczorajz=$wczorajz;
  56. $this->wczorajr=$wczorajr;
  57.  
  58.  
  59. }
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68. }
  69.  
  70. $obiekt = new statystyki;
  71. $obiekt->osoby();
  72. echo $obiekt->dzisiajz; // dzisiaj zalogowani
  73. echo $obiekt->dzisiajr; // dzisiaj zarejestrowani
  74. echo $obiekt->wczorajl; // wczoraj zalogowani
  75. echo $obiekt->wczorajr; // wczoraj zarejestrowani
  76.  
  77. ?>
  78.  
  79.  
  80.  


Tyle w tym dobrego, że całą klasę mam w innym pliku i go includuje, a w dowolnym miejscu wpisuję tylko dwa wyrazy : $obiekt->zalezy_co_chce_otrzymac . Natomiast strukturalnie napisałbym cztery proste funkcje, które wyciągają odpowiednio z bazy danych odpowiednie wartości, albo jedną, w której wpisuję warunek...

Jakie inne zastosowania mógłbym użyć, by to "programowanie obiektowe" w tym przypadku co podałem, było czytelniejsze, o znacząco mniej objętości ? W tym przypadku obciążam bardziej tylko serwer, a w przypadku wielu zapytań obciążył bym bardzo znowu bazę danych... ? Nie chodzi mi tutaj o gotowe rozwiązanie, tylko o wskazówki, czego jeszcze nie zastosowałem, co ułatwiło by pracę na takich właśnie skryptach o oparciu o obiektowość?

Pozdrawiam!

Ten post edytował bialko0019 13.11.2010, 12:10:14
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
bialko0019
post
Post #2





Grupa: Zarejestrowani
Postów: 294
Pomógł: 4
Dołączył: 19.12.2008

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


1) No tak, bo mam trochę w bazie rekordów, które mają puste kolumny `login` i inne, ale ich potrzebuję w innym celu niż statystyki dlatego ich w taki sposób wykluczam teraz.

Czyli w przypadku takiego skryptu założeniem najodpowiedniejszym założeniem by było:

1. Policzenie wszystkich użytkowników, zapytaniem:
  1. SELECT COUNT(*) AS id FROM uzytkownicy

2. Znalezienie, ile jest użytkowników z dzisiejszym logowaniem:
  1. SELECT COUNT( * ) FROM uzytkownicy WHERE rejestracja >= '2010-11-14 00:00:00'

3. Analogicznie z ostatnim logowaniem.. Rzeczywiście, chcę zobaczyć ile takich rekordów jest, a nie potrzebne są mi dane kto co i jak i kiedy, gdy wywołałem zapytaniem SELECT * FROM uzytkownicy...

Teraz praktycznie:

Tworzę klasę.

Piszę funkcje, które zwracają odpowiednie liczby - zależy co chcę uzyskać. Uzyskaną liczbę przypisuję do obiektu, np. : $this=dzisiaj_zalogowani=$dzisiejszy zalogowani . Zamykam klasę.

Teraz w miejscu, gdy chcę wyświetlić te dane statystyczne, po prostu piszę:

  1. <?php
  2.  
  3.  
  4. $obiekt = new cos;
  5. $obiekt->funkcja_dzisiaj();
  6. [...]
  7.  
  8.  
  9. ?>


O to Ci chodziło mniej więcej ?


o coś takiego:

  1.  
  2.  
  3. // ile dzisiaj zalogowanych
  4. // ile wczoraj zalogowanych
  5. // ile dzisiaj rejestrowanych
  6. // ile wczoraj zarejestrowanych
  7.  
  8. class statystyki{
  9.  
  10.  
  11.  
  12. function zalogowani($data){
  13.  
  14. $ilosc = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) FROM uzytkownicy $data"));
  15. $this->osoby=$ilosc['COUNT(*)'];
  16.  
  17. }
  18.  
  19. }
  20.  
  21.  
  22. $obiekt = new statystyki;
  23. $obiekt->zalogowani("WHERE ostatnie_logowanie >= '2010-11-14 00:00:00'");
  24.  
  25. echo $obiekt->osoby;
  26.  


i ten poprzedni wykonuje się średnio 0.5s, a ten powyżej średnio 0.05, może dłużej - czyli ok 10 razy szybciej. Ale mniej więcej, to jest dobrze napisany skrypt z klasą?

Ten post edytował bialko0019 14.11.2010, 11:14:52
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: 28.12.2025 - 14:36