2017-01-17 7 views
1

私は同様の質問がされていることを知っていますが、解決策がないようです。私は自動ログアウト機能を持っています(下記参照)。ブラウザが閉じているとPHPの自動ログアウト機能が働かない

ただし、タブ/ブラウザを閉じると、セッションが破壊されることはなく、さらに重要なことに、DBテーブルtblTimeLogは更新されません。

私がしたいことは、ブラウザまたはタブが閉じていても「タイマーを実行し続ける」ためです。どのようにこれを達成するための任意の提案?

自動ログアウト機能:

<? 
session_start(); 

// set timeout period in seconds 
$idleTime = 2400; 
header("refresh: 2400"); 

// check to see if $_SESSION['timeout'] is set 
if(isset($_SESSION['timeout'])) { 
    $session_life = time() - $_SESSION['timeout']; 
    if($session_life > $idleTime) { 
     $db->Execute("UPDATE tblTimeLog SET LogoutTime = NOW() WHERE sid ='".session_id()."'".$row['konsulentid'].''); 
     session_destroy(); 
     header("Location: login.php?loggut"); 
     exit(); 
    } 
} 
$_SESSION['timeout'] = time(); 
?> 
+0

あなたはタブを閉じるイベントを捕まえることができます。その後、彼は有効期限の後に来るあなたのDBを次回更新する – chhameed

+0

@chhameed答えのために、これはjavascriptが正しいですか?また、次回はDBを更新することもできません。あなたが返すかどうかに関わらず、DBが常に最新のものになるように、 –

+0

yes javascriptですが、javascriptを使用したくない場合は、cron-jobがこれに最適なソリューションです。特定の時間の後に実行され、それに応じてテーブルを更新します。 – chhameed

答えて

0

あなたの問題は、自動ログアウトがサーバーへのリクエストにのみ有効であることです。

依頼依頼が依然として依頼されているかどうかにかかわらず、システムにユーザをログアウトさせたい場合は、またはです。

単純な解決策の1つは、a cron jobを設定して毎分PHPスクリプトを呼び出すことです。スクリプトをすべてのユーザーにループさせ、必要に応じてログアウトします。これは、データベースに最後にリクエストしたときに、別のスクリプトでアクセスできないセッションに保存されているため、データベースに最後に追加したものを保存する必要があります。

また、成功した(ログインした)リクエストでは、ユーザーをログアウトさせるスクリプトをスケジュールできます。その後の要求ごとに、スケジュールされた実行をキャンセルし、別のスケジュールをスケジュールします。

どのソリューションを選択するかは、正確なシステムによって異なります。それぞれの長所と短所を秤量する。たとえば、誰かが実際にログインしているかどうかにかかわらず、常に実行されるため、1つ目は適切ではないかもしれません。

+0

すごく、私はcronジョブを設定する方法を理解するためにいくつかの読書をしなければならないでしょう!提案のおかげでtho。私は毎日新しいものを学んでいます。私は一度私はそれが動作するように解決策としてあなたの答えをフラグする! –

+0

okだから私はまだそれにして、まだ私の問題を解決していない。 @Michaelは次のように書いています: "成功した(ログインした)リクエストでは、ユーザーをログアウトさせるスクリプトをスケジュールすることができます。 これを達成するためにどのように進むべきであるかに関する提案はありますか?私は窓で試しました。onbeforeunloadしかし、これはまた私がサブページに移動するたびにonbeforeunloadを引き起こします。 –

+0

'window.onbeforeunload'?あなたがクライアント側のソリューションを試しているように思えます。私は繰り返し述べます:しないでください。なぜあなたはcronの仕事が適切ではないと判断しましたか? Linuxでジョブをスケジュールするには、 'at'を使います。そのジョブをキャンセルするには、 'at -r'を使います。 – Michael

0

IMO合理的な解決策は、定期的にtblTimeLogテーブル内のすべてのセッションを通過し、タイムアウトが発生した場合、テーブルのLogoutTimeを更新するcronジョブを持つことです。次回、cronスクリプトによってログアウトされたセッションIDを持つクライアントが再び接続すると、セッションCookieが破棄されます。これは、DBセッションの有効期限を記憶することのみを必要とする。

関連する問題