2016-03-24 1 views
0

ネットワーク上でCronジョブを実行して、ログアウトボタンを使用していないユーザーに「粗い」ログアウト時刻を自動的に追加します。私は最終的なコーディングで少し助けが必要です。私​​データベーステーブルにアクティブになっていないすべてのユーザーのログアウト時間を追加します(ブラウザまたはタブを閉じます)

、アクティブまたはアクティブため1ないため0ことができるcurrent_status呼ばれる各ユーザーの行が存在します。このステータスは、自分のネットワークの各ページで更新されます。

また、ユーザがログインすると行が追加されるap_login_historyというデータベーステーブルがあり、の行は、ユーザがログアウトボタンを押すまで0000-00-00 00:00:00と表示されます。

ユーザがログアウトボタンをクリックしなかった場合に空の時間を修正するには、数時間ごとにCronジョブを実行してを0に更新し、300秒待ってユーザーがまだアクティブであるかどうかを確認します0に変更されたメールアドレスが1に更新されていないかどうか再度確認してください。

ユーザーがアクティブでない場合(更新はcurrent_statusはまだそれはcronジョブによって更新された0であることを返しますすなわち)ap_login_history表にlogout_timeにタイムスタンプを追加します。それはsleep()設定と気質だが

//// RESET ANY ACTIVE USERS TO NON ACTIVE 
$sql = "SELECT * FROM `ap_users` WHERE `current_status` = '1'"; 
$result = $conn->query($sql); 

    if ($result->num_rows > 0) { 
// output data of each row 
while($row = $result->fetch_assoc()) { 
     $user_id = $row['user_id']; 
     $email_address[] = $row['email_address']; 
     mysqli_query($conn, "UPDATE `ap_users` SET `current_status` = '0' WHERE `current_status` = '1' AND `user_id` = '$user_id'");           
} 
} 
//// GIVE USERS A CHANCE TO SHOW AS ACTIVE IF STILL LOGGED IN 
sleep(300); 
$timestamp = date("Y-m-d H:i:s"); 
//// UPDATE LOGOUT TIME FOR USERS WHO ARE NO LONGER ACTIVE 
foreach ($email_address as $value) { 
    $sql = "SELECT * FROM `ap_users` WHERE `current_status` = '0' AND email_address = '$value'"; 
$result = $conn->query($sql); 

    if ($result->num_rows > 0) { 
// output data of each row 
while($row = $result->fetch_assoc()) { 
     $email_address = $row['email_address']; 
     mysqli_query($conn, "UPDATE `ap_login_history` SET `logout_date` = '$timestamp' WHERE `email_address` = '$email_address' AND `logout_date` = '0000-00-00 00:00:00'");          
} 
} 
} 

このスクリプトは、作業を行います。

は、ここに私のcronジョブスクリプトです。おおよそ130の下にあるものはすべて成功しますが、これ以上長くなると内部サーバーエラーが発生します。ここではsleep()関数を使うのは良い考えではありません。

ここで待機時間を制御する方法や、100%成功する場合にこの機能を実行する方法はありますか?たぶんそれを少しきれいにすることさえできますか?私の以前のプロジェクトのために、事前

答えて

0

おかげで、私はこの種の作業を行うためにcronジョブを使用していませんでした。私はちょうどJavascriptのタイマーを使用して、ユーザーの状態をチェックし、ユーザーがリンクをクリックするたびに、または他のページへの処理の時間を更新します。

基本的な考え方は次のとおりです。

  1. すると、ユーザのログイン、ログイン日時とアクティブdatatimeを記録するデータベース。 javascriptは、あらかじめ定義された時間(例:300秒)からカウントダウンを開始します。
  2. 時間が経過すると、Javasriptはメッセージを警告し、リダイレクトページを使用してユーザーに強制的にログアウトさせます。リダイレクトページはlogout_time=now()ap_login_historyに更新します。また、それはcurrent_status=0
  3. を設定します。第2の条件 - >ユーザーがリフレッシュまたは別のページまたはリンクに移動すると、タイマーは再びリセットされます。したがって、ログアウトの操作は必要ありません。

ただし、ユーザーがブラウザを閉じるときに役立つことはありません。

だから、すべてのユーザーにクッキーまたはセッションを設定することをお勧めします。基本的な手順です:それぞれのユーザーとのクッキーを設定し

  1. 定義された制限時間(例えば300秒)setCookie References
  2. で、このようなユーザーIDとユーザーがリロードするか、他のページに行くたびに特定し、あなたはまだクッキーかどうかを確認そこかどうか。はいの場合は、新しい日付時刻をクッキーに更新します。前の手順でクッキーを設定したのと同じにする必要があります。いいえ、それはあなたのユーザーがすでにアクティブではないことを意味し、その後、JavaScriptを使用してページをログアウトページにリダイレクトし、データベースを更新するなどの操作を行います。

したがって、期限切れセッションにcronジョブを設定する必要はありません。

希望があなたを助けることができます!

+0

これはユーザーがページを閉じても機能しますか? – Snappysites

+0

noScriptを使用している人やjavascriptを無効にしている人ではうまくいかないことを除いて、私はこれを2番目とします。 – VikingBlooded

+0

ページが閉じていると動作しません。 –

関連する問題