完全なソリューション。仕上げを始める。
これを index.php ページでのみ動作させたい場合は、サーバーに更新を非同期 (AJAX スタイル) で送信して、$_SESSION["userid"]
まだオンラインであるサーバーに警告することができます。
setInterval("update()", 10000); // Update every 10 seconds
function update() {
$.post("update.php"); // Sends request to update.php
}
update.php ファイルには、次のようなコードが含まれます。
session_start();
if ($_SESSION["userid"])
updateUserStatus($_SESSION["userid"]);
これはすべて、ユーザーが Web サイトにログインするときにユーザー ID をセッション変数として保存することを前提としています。updateUserStatus() 関数は、次のような単純なクエリです。
UPDATE users
SET lastActiveTime = NOW()
WHERE userid = $userid
そのため、ストレージを管理できます。次に、「オンライン」のユーザーのリストを取得します。このために、別の jQuery 呼び出しと別の setInterval() 呼び出しが必要になります。
setInterval("getList()", 10000) // Get users-online every 10 seconds
function getList() {
$.post("getList.php", function(list) {
$("listBox").html(list);
});
}
この関数は、10 秒ごとにサーバーから HTML のビットを要求します。getList.php ページは次のようになります。
session_start();
if (!$_SESSION["userid"])
die; // Don't give the list to anybody not logged in
$users = getOnlineUsers(); /* Gets all users with lastActiveTime within the
last 1 minute */
$output = "<ul>";
foreach ($users as $user) {
$output .= "<li>".$user["userName"]."</li>";
}
$output .= "</ul>";
print $output;
これにより、次の HTML が出力されます。
<ul>
<li>Jonathan Sampson</li>
<li>Paolo Bergantino</li>
<li>John Skeet</li>
</ul>
そのリストは、「list」という名前の jQuery 変数に含まれています。前回の jQuery ブロックをもう一度見てみると、そこにあることがわかります。
jQuery はこのリストを取得し、「listBox」というクラス名を持つ div 内に配置します。
<div class="listBox"></div>
これでうまくいくことを願っています。