2017-08-17 8 views
0

私はPHP初心者で、PHPセッションで練習しています。基本的には、セッションが存在しない場合にのみ、ユーザーに表示されるログインフォームがあります。それ以外の場合は、「ユーザーは既にログインしています」と表示されます。 私が使用してセッションライフタイムとクッキーの時間を設定している:phpセッションがその有効期間を設定した後に削除されない

session_set_cookie_params(60); 
    ini_set('session.gc_maxlifetime', 60); 

私は、ユーザーが再度ログインする必要がありますように、セッションが1 minute後に破壊することにしたいです。私の実装では、セッションはまだ長い時間のために存在し、ユーザーがログインしている私のlogin.php

私が持っている:。
1:
2ログイン資格情報をチェックし、POSTのREQとlogin.phpを訪問した場合: 1:データにユーザIDとパスワードを確認しSESSION [「LOGGED_INは」]、そしてフォームを表示しない設定エコー

<?php 

require_once("helpers.php"); 

session_start(); 
if(!empty($_POST)){ 
    loginUser($_POST['user_id'], $_POST['pass']); 
} 

<?php 
if(!isset($_SESSION['logged_in'])){ 
    echo "<br>SESSION IS NOT SET UP"; 
    ?> 

    <HTML> 
    <HEAD> 
     <LINK rel="stylesheet" type="text/css" href="style.css"> 
     <SCRIPT src="test.js"></SCRIPT> 
    </HEAD> 
     <BODY> 
      <H1>Please login</H1> 
      <FORM action="login.php" method="post"> 
       <span class=formlabel>Username:</span> 
       <INPUT name="user_id" type="text" class="forminput" require><BR> 
       <span class=formlabel>Password:</span> 
       <INPUT name="pass" type="password" class="forminput" require><BR> 
       <INPUT type="submit" value="Login" style="width:80px;margin-left:100px;margin-top:3px;"><BR><BR> 
       Don't have an account? <A href="register.php">Click here to register</A>. 
      </FORM> 
     </BODY> 
    </HTML> 
<?php 
}else{ 
    echo '<strong>user already logged in.<br></strong>'; 
} 
?> 

「既にログイン」であれば、私のhelper.phpに私が機能を持っていますbase
2:存在する場合、セッションを設定します。

function loginCheck($user_id, $pass){ 
    //here goes code which checks if user_id & pass exists 
    //store in $RESULT if exists 
    if(!empty($result)){ 

     session_set_cookie_params(30, '/'); 
     ini_set('session.gc_maxlifetime', 30); 
     $_SESSION['username'] = $user_id; 
     $_SESSION['logged_in'] = true; 
    } 
} 

ユーザーとしてログインすると、セッションが開始され、ログインフォームが消えてしまいます。これは正しい動作です。しかし、セッションが終了することはありません。つまり、10分後にページをリフレッシュしても、フォームは表示されず、「ユーザーは既にログインしています」と表示されます。


1:セッションはmaxLifetimeの後に単独で破棄されますか?
2:もしそうでなければ、それを破壊する必要がありますか?


あなたは

+0

セッションを開始する前にセッションパラメータ*を設定する必要があります。 – jeroen

+0

@jeroenもしsessiont_start()の前にセッションパラメータを設定すると、セッションが破棄され、指定された時間後にリセットされますか?ありがとう。 –

答えて

1

gc_maxlifetime値は、データがゴミとして見られるだろうとが潜在的にがクリーンアップまでの秒数です感謝します。セッションがあまりに早く破棄されないように、この値が十分に高く設定されていることを確認したいが、この時間が経過するとセッションが破棄されることはできない。

特定の期間の後にセッションを破棄したい場合は、タイムスタンプを保存し、そのタイムスタンプとセッションの存在を使用してセッションがまだ生きているかどうかを確認する必要があります。

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

続いて、後に、それはまだアクティブだかどうかを確認するには:このような何かその後

if (isset($_SESSION['last_access']) && $_SESSION['last_access'] - 60 > time()) { 
    // The session is still alive 
} else { 
    // The session should be destroyed 
    session_destroy(); 
    unset($_SESSION); 
} 

は、任意の$_SESSION値の存在のために、あなたの将来のチェックは、あなたが期待するように動作します。

+0

また、login.phpでsession_start()を使用しましたが、私のhelpers.phpでもそれを行う必要がありますか?ページをリフレッシュしてクッキーとセッションの有効期間をリセットしますか? –

+0

私はあなたの 'helpers.php'ファイルに' last_access'インデックスを作成するコードを記述します。他のコードは、セッションを検証する必要がある場合はどこにでも行きます。セッションライフタイムカウントは 'session_start()'を呼び出すたびにリセットされます。最後のページアクセスから60秒間セッションを存続させたい場合は(ページを再ロードしてセッションをリフレッシュするようにしてください)、これが望ましい動作です。それ以外の場合は、 'last_access'インデックスが存在するかどうかを確認してから、各ロードをリセットしないようにします。 –

関連する問題