2009-03-24 3 views
3

私は、Webサイト上でアクティブなユーザーの数をリストする簡単な(データベースなし)方法を探しています。私が思いつくことができる最も簡単な方法は、開いているセッションの数を数えることです。開いているセッションの数を確認

このコード作業をする必要があります:(そこにあるべきな!!)もちろん

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

ことしませんので、そのディレクトリ上のセキュリティ制約の。ディレクトリアクセス権を変更しないでこの番号にアクセスする別の方法を知っている人はいますか?

注:私はがデータベースやPHPのセッションのセキュリティを減らすことを必要としないというオプションを探しています。

エンド注:

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

/var/www/sessioncountファイルがで読み取り可能であることを確認してください:この質問に来る人のために、私は次のように何かがなかったルートから(毎分を実行している)cronジョブを使用して終了Apacheユーザー。

$number_of_users = file_get_contents("/var/www/sessioncount"); 

答えて

4

Easyは、この場合データベースがないことを意味しません。また、セッションに依存してアクティブなユーザーの数を確認することも信頼性がありません。

もしあなたがそのルートに行きたいなら、安全なプロセスによって数分おきに実行されるcronジョブを実行し、PHPが読み込んだファイルまたはdbにそのカウントを保存することができます。

しかし、私はデータベースルートに行くことをお勧めします。

+0

データベースメソッドは、任意のWebアプリケーションのための最も遅く、最大のスロットルです。私の目標はデータベースクエリーの数を最小限に減らすことです。私はcronjob、または少なくとも実行中のプロセスのアイデアが好きです。 –

0

セキュリティリスクを引き起こすことなくPHPスクリプトからそのディレクトリにアクセスすることはできません。

あなたが望むものを達成する最も簡単な方法は、データベースを使用することです。 ipとタイムスタンプを保存してから、タイムスタンプに基づいてSELECTを実行して、Webサイトのアクティブユーザー数を取得します。

+0

私はデータベースなしの方法を望んでいました。おかげで –

5
<? 
// 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(); 
?> 
+1

これは巨大なセキュリティ上のリスクを引き起こすため、私が探している答えではありません。しかし、ありがとう。 –

+2

mmmこれはなぜ安全な問題ですか? (またはウェブルートを意味する) – borrel

2

これを他の誰かのために解決するために、ここでは。コードを順番に組み立てて、途中で指示を使用してください。 PHPのGD拡張が必要です。

ウェブデーモンがそれに書き込むことができることを確認し、Webルートディレクトリを作成します。

mkdir liveusers 

は(タッチコードを PHPスクリプト(例えばvlive.php)を作成します。 btw。touchは標準の* nixコマンドです。system()、passthru()、exec()を使いましょう。それは例えば、IP +セッションIDのためのタッチ一意のファイル名とそのディレクトリ内のファイルは、一緒にconcat'dています

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

さて、同じファイルに、私たちはして出力するJPEG仕上げそれを必要とします適切なheader()の私はピクセルという名前の1x1ピクセルを入れます。ウェブルートの/画像/ディレクトリにJPG、他に何かをして自由に感じる:

$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分前。ここ10分間のライブユーザーです...

ここではフルページキャッシュを使用すると、キャッシュされたライブ番号がこれらのドキュメントに凍結される可能性があるため、むしろ迷惑になり、役に立たなくなります。このために私はPrototypeJS(グーグルそれが)、あなたは自分の空想AJAXツールを使用し、その後、</body>タグの上にこれを置くこの

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

<head></head> の間を置いてお勧めします。

<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); 
} 
?> 

これらは、ライブユーザーの最後の10分を示す30秒間APCキャッシュを使用します見つける実行されますコマンドを使用して1分間に2回計算します。悪くない。 :P

クリーンアップのcrontabで行うことができます。..

スクリプト(/ルート/ deloverhead。)SH:

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

crontabエントリ(毎時):

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

楽しみを持って、私は物事が奇妙説明するかもしれない申し訳ありません。 :P

関連する問題