2012-12-01 12 views
5

Ci sono discussioni sulla memorizzazione di visualizzazioni di pagina per un articolo o un video in un database, ma non riesco a trovare alcuna informazione sull'archiviazione delle pagine giornaliere . Ad esempio DeviantArt ti mostra gli ultimi 15 giorni e il numero di visualizzazioni di pagina che ognuno ha in un piccolo grafico, oltre alla visualizzazione di pagina totale per il profilo.Il modo più efficiente di memorizzare viste di pagina giornaliere, nonché un conteggio totale

Pageviews example

potete vedere sopra esattamente quello che sto cercando di realizzare, e DeviantArt farlo su vasta scala mentre ottengono milioni di visite.

Sto usando CodeIgniter su PHP e MySQL

+0

Ho aggiornato la mia risposta. Per curiosità, che sito è? Sono sorpreso che ti aspetti milioni di visite al giorno. – Marvin

+0

Per lo più per interesse, non ho bisogno di usare uno script come questo in questo momento, ma sto iniziando a lavorare su alcuni siti più grandi quindi probabilmente ne avremo bisogno in futuro :) – Adam

risposta

5

Si potrebbe avere una riga per ogni giorno e poi incrementare il conteggio quando viene visualizzato .

INSERT INTO views (day,views) VALUES (CURDATE(),1) ON DUPLICATE KEY UPDATE views=views+1; 

E uno script PHP ...

mysql_query("INSERT INTO views (day,views) VALUES (CURDATE(),1) ON DUPLICATE KEY UPDATE views=views+1;"); 

Questo utilizza una tabella chiamata 'vista' e 'giorno' 2 righe e 'vista'.

Vedere this article per ulteriori informazioni.

4

Io non uso CodeIgniter, ma ecco come si può fare questo in php dritto.

In pratica, è possibile utilizzare le sessioni per registrare ogni visita al proprio sito e registrare le richieste di pagine o semplicemente registrare ogni hit sulla pagina. La prima opzione ti dà più informazioni (quanti colpi unici sono stati fatti, quanti colpi provengono da visitatori di ritorno, ecc.) Ma richiede più programmazione per la configurazione e richiede la gestione della sessione utente. Così, per i vostri scopi vi spiego l'opzione 2.

SQL:

Table 'pageViews' 
Id - Integer, auto Increment, primary key 
page - varchar(150) 
datetime - datetime 

Nella pagina che stai monitoraggio, si dovrebbe aggiungere:

$query2 = "INSERT INTO `pageViews` (page, datetime) VALUES ('".$_SERVER["SCRIPT_NAME"]."', ".date("Y-M-d H:I:s").")"; 
    $result2 = //insert DB connection etc. to apply update to DB 

È quindi possibile recuperare le righe dal db in base alla pagina e al timestamp, conta i risultati e visualizzali utilizzando il canvas html5. Oppure, poiché ogni hit ha un datetime, è possibile suddividerlo ulteriormente in ore del giorno ecc.

Spero che questo aiuti.


Per modificare questo per semplici contatori giornalieri, aggiungere una colonna aggiuntiva denominata "viste" che è solo un numero intero. Quindi nella pagina metti un segno di spunta per vedere se c'è una riga per la pagina corrente per oggi nel db. In tal caso, ottenere il valore attuale delle visualizzazioni e incrementarlo e rivendenderlo nel DB.

Per il totale di visualizzazioni probabilmente creerei un'altra tabella con le stesse colonne ma non con la colonna di data e ora. Quindi, nella tua pagina, incrementerai il valore delle visualizzazioni per la pagina corrente anche nella nuova tabella.

Questo sarebbe un fulmine veloce. Il trade-off è la perdita di dettagli. Quindi, ecco il MySQL e PHP per questa terza opzione:

MySQL:

Table 'dailyViews' 
Id - Integer, auto Increment, primary key 
views - integer 
page - varchar(150) 
datetime - datetime 

Table 'totalViews' 
Id - Integer, auto Increment, primary key 
views - integer 
page - varchar(150) 

PHP:

// Search the DB for an entry today for this page in dailyViews 
$query = "SELECT views FROM `dailyViews` WHERE `page`='".$_SERVER["SCRIPT_NAME"]."' AND `datetime`=".date("Y-M-d H:I:s").""; 
$result = //insert your db connection etc to execute the query 

if (mysqli_num_rows($result)==1) { 
    $resultArray = mysqli_fetch_array($result, MYSQLI_ASSOC); 
    $views = $resultArray['views']+1; 
    $query2 = "UPDATE `dailyViews` SET `views`=".$views." WHERE `page`='".$_SERVER["SCRIPT_NAME"]."' AND `datetime`=".date("Y-M-d H:I:s").""; 
    $result2 = //insert DB connection etc. to apply update to DB 
} else if (mysqli_num_rows($result)<1) { 
    $query2 = "INSERT INTO `dailyViews` (views, page, datetime) VALUES (1, '".$_SERVER["SCRIPT_NAME"]."', ".date("Y-M-d H:I:s").")"; 
    $result2 = //insert DB connection etc. to apply update to DB 
} else { 
    // there is more than one entry for this page and date in the DB. An error has ccurred 
} 

// Then just get the total views for this page and increase it by 1. 
+0

Quindi stai dicendo una nuova riga per ogni visualizzazione di pagina? Non sarebbe davvero lento su un sito enorme con milioni di visite al giorno? – Adam

+0

Dipende dal sito, ma in genere si tratta di milioni di visite al giorno quindi generalmente no. Le righe sono molto piccole in termini di byte, quindi la risposta è molto veloce. Il metodo che ho suggerito è facilmente estendibile per ottenere maggiori informazioni sulle visualizzazioni di pagina (come scomposizione in conteggi di visualizzazioni orarie). Posso aggiungere una semplice opzione contatore giornaliero se preferisci. – Marvin

4

Di solito ciò che si fa in questi casi è una tabella di registrazione con 1 record per visualizzazione. È possibile eseguire un cron a determinati intervalli (ogni giorno) per riepilogare i dati di registrazione in un'altra tabella di riepilogo. Al livello più elementare, avresti 1 record al giorno nella tabella di riepilogo con il conteggio totale delle visualizzazioni. Poiché i dati storici non cambiano mai, non è necessario effettuare aggiornamenti. Ciò ti dà al massimo 365 record per articolo all'anno. Non molti record, quindi è in grado di adattarsi bene.

Questa scala è migliore di quella di avere un singolo record per ogni giorno e aggiornare il conteggio. È possibile che si verifichino problemi di blocco/contesa se si tenta di aggiornare lo stesso record più volte. Effettuando un INSERT DELAYED e utilizzando una tabella MyISAM, la tabella di registrazione può ridimensionarsi molto bene.

È quindi possibile selezionare dalla tabella di riepilogo per ottenere i conteggi giornalieri e, se si desidera visualizzare il conteggio dei giorni correnti, è possibile selezionare dalla tabella di registrazione.

Se si desidera mantenere piccola la tabella di registrazione, quando si esegue cron, è possibile rinominare la tabella di registrazione e crearne una nuova vuota. Quindi elaborare la tabella di registrazione rinominata.

RENAME TABLE logging TO logging_old;CREATE TABLE logging LIKE logging_old; 

Se è davvero necessario ridimensionare, è possibile utilizzare un trucco di replica per registrare le visualizzazioni estremamente veloce. Si utilizza un tipo di tabella BLACK HOLE per i dati di registrazione, che si replica su un altro server in cui la tabella è MyISAM o InnoDB.

Problemi correlati