簡體   English   中英

找出有多少用戶在線使用PHP?

[英]Find out how many users are online in PHP?

每次訪問我的網站都會更新用戶的單個點擊計數器,並根據存儲在Cookie中的IP地址和ID更新time()列。 因此,在輸出數據時,以下代碼是一種更有效的方式,它減少了數據庫調用,因為它本質上是其自身的副本:

<?
$last1Min = time()-60;
$last5Mins = time()-300;
$last1Hr = time()-6000;
$last1Dy = time()-144000;
$last1Wk = time()-1008000;
$last1Mnth = time()-30240000;

//last1Min
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Min";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last minute: " . $rows['COUNT(*)'] . "<br />\n";
}

//last5Mins
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last5Mins";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last 5 minutes: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Hr
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Hr";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last hour: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Dy
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Dy";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last day: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Wk
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Wk";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last week: " . $rows['COUNT(*)'] . "<br />\n";
}

//last1Mnth
$sql = "SELECT COUNT(*) FROM usersonline WHERE lastOnline > $last1Mnth";
while($rows = mysql_fetch_array(mysql_query($sql))) {
    echo "Users online in the last month: " . $rows['COUNT(*)'] . "<br /><br />\n";
}

如果有一種更有效的方式來顯示此數據,我想對其進行擴展以不僅顯示整個站點上每個指標的在線用戶數,還記錄並輸出站點上每個頁面的數據。

SELECT 
  SUM(lastOnline <= 60) AS one_minute,
  SUM(lastOnline <= 300) AS five_minutes,
  ...
  SUM(lastOnline <= 30240000) AS one_month
FROM usersonline

使用此方法,您可以通過單個表掃描在單個查詢中獲得所需的一切。 它沒有比這更有效的方法了。 正如其他人提到的那樣,您應該緩存結果,因為它相對昂貴(即使采用這種優化形式)。 在每次頁面加載時都沒有必要計算此值,尤其是如果您每秒看到多次點擊(如果您點擊了digg的首頁,則極有可能)

對於條件為真的行,lastOnline <= 60的結果為1;對於條件為假的行,lastOnline的結果為0; SUM()將這些1和0相加,得出條件為真的行數。

幾年前從mysql文檔中的用戶評論中學到了這項技術; 其他地方也有類似的例子

設置一個cron作業,該作業每分鍾/ 5分鍾/等僅計算一次正確的值。 緩存結果並顯示出來。 當這些統計信息每分鍾更改一次或每半小時更改一次時,實際上並不需要每秒計算X次。

不必每次都調用數據庫,您只需在上個月內調用所有數據庫,然后按日期對它們進行排序即可。 然后在php中,您可以比較日期和時間,以查看用戶上次登錄的時間。

如果將會話保存到文件,則可以計算一個時間段內已訪問的文件數。 這樣就根本沒有數據庫訪問權限。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM