1

ユーザーが10分間ページを変更しない場合、ユーザーをログアウトさせるこのコードがあります。

$inactive = 600;

if(isset($_SESSION['timeout']) ) {
  $session_life = time() - $_SESSION['timeout'];
  if($session_life > $inactive) { 
    header("Location: logout.php"); 
  }
}

$_SESSION['timeout'] = time();

ご覧のとおり、これは非常に簡単です。保護されているすべてのページの上部にこの関数を含めます。スクリプトが10分間実行されない場合、次にページを更新すると、ユーザーはログアウトスクリプトに送られます。

しかし、それが問題です。$ session_life> $ inactiveがtrueになった後、ユーザーがログアウトするには、スクリプトを再度実行する必要があります。これが真実になったらすぐにその人をログアウトさせる必要があります。

物事が複雑になりすぎずにこれを行う方法はありますか?(つまり、AJAXを使用していません)

4

4 に答える 4

7

いいえ。PHPコードはすべてのリクエストで実行されます。タイムアウトを「すぐに」トリガーする場合は、継続的なリクエストでサーバーにスパムを送信するか(悪い考え)、タイムアウトロジックをクライアント側のコードに移動する必要があります。

適切な解決策は、ページの読み込み時にJavascriptタイマーを開始し、タイマーの期限が切れたときにユーザーをログアウトページにリダイレクトすることです。その間にユーザーが別のページに移動すると、現在のタイマーは自動的に破棄され、そのページが読み込まれると新しいタイマーが開始されます。これは次のように単純な場合があります。

<script type="text/javascript">
    setTimeout(function() { window.location.href = "logout.php"; }, 60 * 10);
</script>

更新:もちろん、サーバー側のコードも保持して、自分の側でビジネスルールを適用する必要があります。Javascriptは、クライアント側が協力するときに「最適な」シナリオを提供します。PHPコードは、クライアント側があなたに不利に働くかどうかを保証します。

于 2012-07-09T11:10:01.083 に答える
0

現在の時刻をsubtrctingすることでそれを行うことができますsaytime(); あなたが望む時間に。このリンクを試してください。

30分後にPHPセッションを期限切れにするにはどうすればよいですか?

于 2012-07-09T11:15:53.750 に答える
0

テストしたところ、サーバーのセットアップで機能するという考えがあります。Linux呼び出しを使用して、セッションファイルの遅延削除をセットアップします。これは純粋にサーバー側であり、必要なときに正確にセッションを強制終了します。ただし、シェルコマンドを実行するには権限が必要です。

$inactive = 600;

# if there is a delayed removal - cancel it
if (isset($_SESSION['pid'])) shell_exec('kill -9 '.$_SESSION['pid']);

# compose path to session file
$sesspath = session_save_path().'/sess_'.session_id();

# set up a delayed removal to destroy the session after $inactive seconds and
# get its PID
#
# you can put whatever command you like inside the single quotes (call a logout
# php script perhaps?)
$_SESSION['pid'] = shell_exec("nohup sh -c 'sleep $inactive && rm $sesspath' > /dev/null & echo $!");
于 2012-07-09T12:09:32.387 に答える
0

ページのヘッダーにメタリフレッシュを含め、ページが出力されてからの経過時間を確認します。いくつかの単純なサーバー側ロジックでそれを実現できます。

于 2012-12-01T16:22:57.453 に答える