簡體   English   中英

查找打開的會話數

[英]Find Number of Open Sessions

我正在尋找一種簡單(無數據庫)的方法來列出網站上活躍的用戶數量。 我能想到的最簡單的方法是計算打開的會話數。

此代碼應該可以工作:

$number_of_users = count(scandir(ini_get("session.save_path")));

當然它不會因為該目錄的安全限制(應該有..)。 有誰知道在不更改目錄權限的情況下訪問此號碼的另一種方法。

注意:我正在尋找不涉及數據庫或降低 PHP 會話安全性的選項。

結束說明:對於任何提出這個問題的人,我最終使用了一個來自 root 的 cronjob(每分鍾運行一次),它做了類似的事情:

ls /var/lib/php5/ | wc -l > /var/www/sessioncount

確保 apache 用戶可以讀取/var/www/sessioncount文件。 然后你就可以讀取 PHP 中的文件:

$number_of_users = file_get_contents("/var/www/sessioncount");
<?
// you must set your own accessible session path atop every page.
session_save_path("/home/some/other/location/"); # SECURITY VIOLATION!!!
session_start();

function session_count() {
  $filter = "sess_";
  $files = scandir(session_save_path());
  $count = 0;
  foreach ($files as $file) {
    if(strpos($file,$filter)===0) {
      $count += 1;
    }
  }
  return $count;
}

echo session_count();
?>

在這種情況下,簡單並不意味着沒有數據庫。 還靠session來看看有多少用戶活躍是不可靠的。

如果您想要 go 這條路線,您可以執行一個由安全進程每隔幾分鍾運行的 cronjob 並將該計數保存到 PHP 讀取的文件或數據庫中。

但我建議走數據庫路線。

為了其他人解決這個問題,在這里。 按順序組裝代碼,並在途中使用說明。 需要 PHP 的 GD 擴展。

在你的 webroot 中創建一個目錄,確保 web 守護進程可以寫入:

mkdir liveusers

觸摸代碼創建一個 PHP 腳本(例如vlive.php )(順便說一句,觸摸是標准的 *nix 命令,使用 system()、passthru() 或 exec() 任何你想使用的命令)。 讓它接觸該目錄中具有唯一文件名的文件,例如 IP+SessionID 連接在一起:

<?php 
exec("touch ". $_SERVER['DOCUMENT_ROOT']."/liveusers/". md5($_SERVER['REMOTE_ADDR'].session_id())); /* SECURITY RISK */

現在,在同一個文件中,我們需要 output 一個 JPEG 並使用適當的 header() 來完成它我將一個名為pixel.jpg的 1x1 像素放入 webroot 的/images/ 目錄中,隨意做其他事情:

$NewImage = imagecreatefromjpeg($_SERVER['DOCUMENT_ROOT']. "/images/pixel.jpg");
header("Content-type: image/jpeg");
imagejpeg($NewImage);
?>

保存 PHP 文件,然后在文檔中放置標准 HTML 標記以使其有用:

<img src="/vlive.php" alt="Imagination!" />

用這個去純粹的 PHP 然后緩存頁面就可以了,所以實時用戶文件幾乎不會被觸及 通過這樣做,您仍然可以計算“實時”用戶並在您的站點上使用整頁緩存系統。

好的,現在訪問者加載的每個頁面都會觸摸他們唯一的文件,所以如果他們剛剛到達,觸摸命令將為該用戶創建一個文件,如果他們也在訪問其他頁面,它將使用相同的觸摸編輯訪問日期命令。

這是它變得有用的地方:

在不同的 PHP 腳本中(比如說readvlive.php ):

<?php 
$livenum = system("find ".$_SERVER['DOCUMENT_ROOT']."/liveusers/ -type f -amin +10 | wc -l");
echo "Live Visitors: ". $livenum;
?>

現在讓我們將此片段包含到您希望在其中看到的 HTML 元素中:

<?php include($_SERVER['DOCUMENT_ROOT']. "/readvlive.php"); ?>

好的,現在我們有一個文件,它將打印出訪問時間僅在 10 分鍾前更改的唯一文件的數量。 這些是我們最后十分鍾的現場用戶...

現在我們在這里有一個選擇,同樣,如果您使用全頁緩存,您可能會將緩存的實時號碼凍結到這些文檔中,從而使其相當煩人且無用。 為此,我建議使用 PrototypeJS(谷歌),你使用他們花哨的 AJAX 工具,把它放在<head></head>之間

<script src="/js/prototype.js" type="text/javascript"></script>

然后將其放在</body>標記上方。

<span id="live_users_count">&nbsp;</span>


<script type="text/javascript">
    <!--
    Event.observe(window, 'load', function() {
        if($('live_users_count')) {
            new Ajax.Updater('live_users_count','/readvlive.php'); 
        }
   }
-->
</script>

應該沒問題。。不要太粗糙。 如果你擔心你的目錄將運行多少 find 命令,你可以使用 APC 或其他東西來緩存它。 此示例需要 APC 3.1.4:

<?php
if(apc_exists('livenum')){
    $livenum = apc_fetch('livenum');echo $livenum;
} else {
    $livenum = system("find ".$_SERVER['DOCUMENT_ROOT']."/liveusers/ -type f -amin +10 | wc -l");
    apc_add('livenum',$livenum,30); 
}
?>

APC 3.0.13 及更高版本:

<?php
if($livenum = apc_fetch('livenum')){
    echo $livenum;
} else {
    $livenum = system("find ".$_SERVER['DOCUMENT_ROOT']."/liveusers/ -type f -amin +10 | wc -l");
    apc_add('livenum',$livenum,30); 
}
?>

這些將使用 APC 緩存 30 秒,顯示最后 10 分鍾的實時用戶,將運行 find 命令以每分鍾計算兩次。 不錯。 :P

清理可以使用 crontab 完成。

腳本( /root/deloverhead.sh ):

#!/bin/sh
find "/path/to/liveusers/ -type f -amin +60 -exec rm {} \;

crontab 條目(每小時):

0 * * * * /root/deloverhead.sh >/dev/null 2>&1

玩得開心,對不起,我可能會解釋一些奇怪的事情。 :P

您無法從 PHP 腳本訪問該目錄,而不會造成安全風險。

實現您想要的最簡單的方法是使用數據庫。 只需存儲 ip 和時間戳,然后根據時間戳存儲 SELECT 即可獲取您網站上的活躍用戶數。

暫無
暫無

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

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