php
  • mysql
  • 2011-01-21 16 views 35 likes 
    35

    A tak najlepiej to znaczy najbardziej wydajny, teraz to na umieszczenie mojego pliku post.php jest jedyną rzeczą, którą mogę pomyśleć:Jaki jest najlepszy sposób liczenia odsłon w PHP/MySQL?

    $query = mysql_query(" UPDATE posts SET views + 1 WHERE id = '$id' "); 
    

    czy istnieje lepszy sposób, to metoda, która będzie zużywać mniej zasobów serwerowych . Pytam, ponieważ gdyby to była mała aplikacja, nie miałbym problemu z powyższymi, ale staram się zbudować coś, co będzie używane przez wiele osób i chcę być jak najbardziej świadomym zapytania.

    +0

    Można pominąć PHP/MySQL i zamiast tego użyj plików. –

    Odpowiedz

    56

    Jeśli jesteś zainteresowany ochrony zasobów i nadal za pomocą SQL do raportowania i precyzyjne # Nie ma znaczenia, można spróbować próbkowanie tak (zmodyfikować częstotliwość próbkowania do własnych skalę):

    $sample_rate = 100; 
    if(mt_rand(1,$sample_rate) == 1) { 
        $query = mysql_query(" UPDATE posts SET views = views + {$sample_rate} WHERE id = '{$id}' "); 
        // execute query, etc 
    } 
    
    +0

    W zależności od tego, jak duża jest "duża liczba użytkowników", może być korzystne unikanie MySQL w przypadku tabel, które mogą się wydłużyć. Dobrą zasadą jest to, że: * Jeśli jakakolwiek kolekcja (tabela) może przekroczyć 10 milionów rekordów podczas życia aplikacji, prawdopodobnie nie należy przechowywać tej kolekcji w MySQL *. Polecam zbadanie MongoDB i Membase, zanim będzie za późno! –

    +0

    @dorkitude, czy masz jakieś dodatkowe informacje/odniesienia do tej reguły? Mamy tabele w dziesiątkach miliardów rzędów bez problemu. Nie mówienie, że MongoDB/memcached nie są dobrym zasobem, tylko zastanawia się, gdzie możemy znaleźć więcej informacji. – jasonbar

    +0

    Dziesiątki ** miliardów ** w tabeli mysql? Czy jesteś tego pewien? –

    2

    Możesz przechowywać tablicę liczników w pamięci podręcznej (np. APC lub Memcache) i zwiększyć licznik dla określonych postów. Następnie przechowuj aktualizacje raz na jakiś czas. Możesz utracić niektóre widoki, jeśli reset pamięci podręcznej pojawi się ponownie. Inne rozwiązanie polegałoby na zachowaniu oddzielnej tabeli tylko dla wizyt (pole: postid, wizyty). To są posty, które możesz dostać z mysql. Spróbuj użyć silnika InnoDB, ponieważ zapewnia blokowanie na poziomie rzędu!

    17

    Jeśli memcache jest opcją w środowisku serwera, oto kolejny fajny sposób, aby próbki, ale również nadążać za dokładną liczbę (w przeciwieństwie do innych moją odpowiedź):

    function recordPostPageView($page_id) { 
        $memcache = new Memcached(); // you could also pull this instance from somewhere else, if you want a bit more efficiency* 
    
        $key = "Counter for Post {$page_id}"; 
    
        if(!$memcache->get($key)) { 
         $memcache->set($key, 0); 
        } 
    
        $new_count = $memcache->increment($key); 
    
        // you could uncomment the following if you still want to notify mysql of the value occasionally 
        /* 
        $notify_mysql_interval = 100; 
        if($new_count % $notify_mysql_interval == 0) { 
         $query = mysql_query("UPDATE posts SET views = {$new_count} WHERE id = '{$page_id}' "); 
         // execute query, etc 
        } 
        */ 
    
        return $new_count; 
    } 
    
    • i nie przeszkadza purystów płaczących o Singletonach. Lub można było przekazać go do tej funkcji, jeśli jesteś bardziej purist niż pragmatykiem :)
    +0

    Konfigurowanie memcached i pomieszanie memcache i memcached na bok, było to niezwykle eleganckie rozwiązanie, a wyniki testów porównawczych są również bardzo dobre! Dzięki za niesamowite informacje. – Suyash

    +0

    Działa to doskonale, ponieważ ulepszenie przekazuje wartość licznika z bazy danych do funkcji jako dodatkowej zmiennej, a następnie użyj tej wartości, aby ustawić klucz memcache. W ten sposób licznik pozostaje zsynchronizowany (plus lub minus wartość interwału), jeśli memcache zostanie zrestartowany. – paj

    +0

    @paj Lub możesz po prostu spłukać swój Memcache na każdym cronjob i zacząć od nowa, tylko sumując liczbę w db za pomocą count = count + memcache (getkey) – Suyash

    6

    IMHO najlepszym rozwiązaniem jest mieć views_count przechowywane wewnątrz pamięci (memcached, cokolwiek), i zrobić aktualizacje w pamięci. (Oczywiście aktualizacje muszą być zsynchronizowane)

    Następnie można użyć skryptu cron, który przeniesie te wartości do bazy danych. (po pewnym czasie - sekundach, minutach, cokolwiek.)

    3

    możesz również sprawdzić ten wiersz kodu. Pomoże ci to, ponieważ możesz osiągnąć swój cel za pomocą pliku tect. Nie wymaga żadnej aktywności bazy danych.

    <?php 
     
    session_start(); 
     
    $counter_name = "counter.txt"; 
     
    // Check if a text file exists. If not create one and initialize it to zero. 
     
    if (!file_exists($counter_name)) { 
     
        $f = fopen($counter_name, "w"); 
     
        fwrite($f,"0"); 
     
        fclose($f); 
     
    } 
     
    // Read the current value of our counter file 
     
    $f = fopen($counter_name,"r"); 
     
    $counterVal = fread($f, filesize($counter_name)); 
     
    fclose($f); 
     
    // Has visitor been counted in this session? 
     
    // If not, increase counter value by one 
     
    if(!isset($_SESSION['hasVisited'])){ 
     
        $_SESSION['hasVisited']="yes"; 
     
        $counterVal++; 
     
        $f = fopen($counter_name, "w"); 
     
        fwrite($f, $counterVal); 
     
        fclose($f); 
     
    } 
     
    echo "You are visitor number $counterVal to this site";

    2

    w bazie danych istnieje tylko jedna kolumna ip z klucza podstawowego zdefiniowanego a następnie zapisać IP w bazie danych przy użyciu kodu PHP poniżej:

    plik połączenia:

    <?php 
    $conn = mysqli_connect("localhost","root",""); 
    if (!$conn) { 
        die("Connection failed: " . mysqli_connect_error()); 
    } 
    $db=mysqli_select_db($conn,"DB_NAME"); 
    if(!$db) 
    { 
        echo "Connection failed"; 
    } 
    ?> 
    

    Plik PHP:

    <?php 
    $ip=$_SERVER['REMOTE_ADDR']; 
    $insert="INSERT INTO `id928751_photography`.`ip` (`ip`)VALUES ('$ip');"; 
    $result = mysqli_query($conn,$insert); 
    ?> 
    

    pokaz count:

    <?php 
    $select="SELECT COUNT(ip) as count from ip;"; 
    $run= mysqli_query($conn,$select); 
    $res=mysqli_fetch_array($run); 
    echo $res['count']; 
    ?> 
    

    użyciu tej metody w sklepie bazy wszystko IP serwera

    UWAGA: Tylko serwera IP może przechowywać ani nie liczyć IP urządzenia

    Powiązane problemy