Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL] Liczba aktywnych użytkowników przez ostatnie 24h
GigaDownload
post
Post #1





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 27.12.2007

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


Mam taki kod dla liczby aktywnych użytkowników przez ostatnie 24h:



Kod
<?php 
$polaczenie=mysql_connect('','','')
    or die('');

mysql_select_db('')
    or die('');
    
$czas=mktime();
$ip=$_SERVER['REMOTE_ADDR'];
$staryczas=mktime()-86400;


$zapytanie=mysql_query("DELETE FROM dzis WHERE czas<'$staryczas'");

$link=mysql_query("SELECT ip FROM dzis WHERE ip='$ip'");
$ile=mysql_num_rows($link);

if($ile==0)
    {
    mysql_query("INSERT INTO dzis VALUES(NULL,'$ip','$czas')");
    }
else
    {
    mysql_query("UPDATE dzis SET czas='$czas' WHERE ip='$ip'");
    }
$link=mysql_query("SELECT * FROM dzis");
$ile=mysql_num_rows($link);

echo '<b>'.$ile.'</b>';
?>




Czy ten kod jest optymalny? Gromadzi mi się w tabeli od 2300 do 2700 rekordów, więc obrót danych jest trochę duży.
Czy da się jakoś jeszcze zoptymalizować ten kod, by zżerał mniej zasobów konta na hostingu współdzielonym?

Demo działania jest na http://www.gigadownload.net.pl w panelu Statystyki (po prawej).


Pozdrawiam

Ten post edytował GigaDownload 9.11.2008, 19:48:33
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
Sh4dow
post
Post #2





Grupa: Zarejestrowani
Postów: 569
Pomógł: 0
Dołączył: 17.08.2003
Skąd: Dąbrowa Górnicza

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


No niestety to raczej optymalne nie jest, zamiast zliczać rekordy tak:
  1. <?php
  2. //...
  3. $link=mysql_query("SELECT * FROM dzis");
  4. $ile=mysql_num_rows($link);
  5. //...
  6. ?>

zrob tak:
  1. <?php
  2. $link=mysql_query("SELECT count(*) FROM dzis");
  3. $row = mysql_fetch_array($link);
  4. $ile = $row[0]
  5. ?>

to powinno przyzpieszyc troche i nie bedzie przesylac tyle danych miedzy serverm mysqla a php i ogranicz ilość zapytań dwa powinny w zupełności wystarczyć. Pierwsze kasuje wszystkie stare wpisy i twoj, a drigi dodaje twoj wpis.
  1. <?php
  2. mysql_query("DELETE FROM dzis WHERE czas<'$staryczas' AND ip='$ip'");
  3. ?>
a drugie praktycznie bez zmian
  1. <?php
  2. mysql_query("INSERT INTO dzis VALUES(NULL,'$ip','$czas')");
  3. ?>
no i trzecie zapytanie do zlicznia jak wyżej w przykładzie

Ten post edytował Sh4dow 10.11.2008, 15:40:01
Go to the top of the page
+Quote Post
GigaDownload
post
Post #3





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 27.12.2007

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


Nie kasują się stare rekordy, wgrałem stary plik i wyświetliła się poprawna wersja niższa o 600 rekordów (pokazywało wcześniej 3100)

Ten post edytował GigaDownload 11.11.2008, 09:45:46
Go to the top of the page
+Quote Post
Sh4dow
post
Post #4





Grupa: Zarejestrowani
Postów: 569
Pomógł: 0
Dołączył: 17.08.2003
Skąd: Dąbrowa Górnicza

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


chyba jednak był błąd, pisałem wszystko z głowy nie mialem czasu sprawdzić. W zapytaniu kasującym zamiast połączenia warunków słowem AND powinno użyć się słowa OR
  1. <?php
  2. mysql_query("DELETE FROM dzis WHERE czas<'$staryczas' OR ip='$ip'");
  3. ?>
Go to the top of the page
+Quote Post
GigaDownload
post
Post #5





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 27.12.2007

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


Przy okazji się spytam...

Mam dwa liczniki online działające na tej samej bazie danych, chciałbym wsumować ich liczbę rekordów (czyli ludzi online) - może ktoś podać gotowy kod?
Go to the top of the page
+Quote Post
mike
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Dwóch liczb dodać nie potrafisz?
A jeśłi chodzi o gotowca to ja mogę podać gotowe (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Ile płacisz?
Go to the top of the page
+Quote Post
GigaDownload
post
Post #7





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 27.12.2007

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


Nie zamierzam kształcić się w kierunku specjalisty od zapytań MySQL, ani programisty php... wiem za co jest odpowiedzialny każdy kawałek kodu, tylko nie wiem jak napisać optymalnie własny kod...
Go to the top of the page
+Quote Post
singollo
post
Post #8





Grupa: Zarejestrowani
Postów: 47
Pomógł: 1
Dołączył: 25.11.2003

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


Moja propozycja jest taka:

jeśli uznajesz IP za wystarczająco unikalne, zrób sobie taką tabelę w MySQL

  1. CREATE TABLE stats (ip VARCHAR(15), lastSeen DATETIME, PRIMARY KEY(ip))


aktualizację robisz tak:
  1. <?php
  2. $czas = time();
  3. mysql_query("INSERT INTO stats(ip, lastSeen)
  4. VALUES
  5. ($_SERVER['REMOTE_ADDR'], FROM_UNIXTIME($czas))
  6. ON DUPLICATE KEY UPDATE
  7. lastSeen = FROM_UNIXTIME($czas)");
  8. ?>


ilość ostatnio widzianych robisz tak:

  1. <?php
  2. $wczoraj = time() - 24 * 60 * 60; // dokładnie 24h temu
  3. $result = mysql_query("SELECT COUNT(*) AS counter FROM stats WHERE lastSeen > FROM_UNIXTIME($wczoraj)");
  4. $row = mysql_fetch_assoc($result);
  5. echo $row['counter'];
  6. ?>


Od razu mówię - piszę z głowy, bez sprawdzania, więc nie gwarantuję 100% poprawności/braku literówek itp.

Edit:
1. tak sobie pomyślałem, że na kolumnie lastSeen też możesz założyć index. I być może będzie szybciej, jeżeli ta kolumna nie będzie typu DATETIME ale po prostu INT - odpadną kwestie przekształcania i przetwarzania funkcji FROM_UNIXTIME
2. Nie umieszczam tu kasowania: nie musisz kasować na bieżąco, bo filtrujesz wyniki przy liczeniu -> w efekcie masz jedno zapytanie mniej. Kasowanie możesz sobie odpalić raz na jakiś czas...

Ten post edytował singollo 27.11.2008, 00:34:35
Go to the top of the page
+Quote Post
GigaDownload
post
Post #9





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 27.12.2007

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


Do wyświetlania ilości online dla jednego serwisu mam:
Kod
<?php
$polaczenie=mysql_connect('','','')
    or die('Nieudane poczenie z baz danych...');

mysql_select_db('')
    or die('Nieudane wybranie bazy danych...');
    
$link=mysql_query("SELECT count(*) FROM tabela1");
$row = mysql_fetch_array($link);
$ile = $row[0];

echo ' <b>'.$ile.'</b>';
?>


Nie możesz przekształcić tego, aby zliczało też tabela2? Nie musi być niezliczanie takich samych IP.


edycja: prosiłbym o odpowiedź
Go to the top of the page
+Quote Post
lukasz_os
post
Post #10





Grupa: Zarejestrowani
Postów: 203
Pomógł: 55
Dołączył: 23.11.2008
Skąd: UKF

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


Jezeli nazwa tabeli to tabela2 to zrob tak:
  1. <?php
  2. $polaczenie=mysql_connect('','','')
  3.     or die('Nieudane poczenie z baz danych...');
  4.  
  5.     or die('Nieudane wybranie bazy danych...');
  6.    
  7. $link=mysql_query("SELECT count(*) FROM tabela1");
  8. $row = mysql_fetch_array($link);
  9. $ile = $row[0];
  10. $link=mysql_query("SELECT count(*) FROM tabela2");
  11. $row = mysql_fetch_array($link);
  12. $ile2 = $row[0];
  13. $ilosc=ile+ile2;
  14. echo ' <b>'.$ilosc.'</b>';
  15. ?>


Pozdrawiam.
Go to the top of the page
+Quote Post
GigaDownload
post
Post #11





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 27.12.2007

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


Coś nie zlicza, pojawia się 0...


edycja: poradziłem sobie, wystarczyła mała poprawka.

Ten post edytował GigaDownload 30.11.2008, 19:50:09
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: 22.08.2025 - 15:29