web-dev-qa-db-ja.com

ページをリロードせずにセッションを維持する方法は?

オンラインテスト管理システムに奇妙な問題があります。

テストフォーム(test.php)の一部のユーザーは、質問に答えてフォームを送信するのに長い時間が必要です。

フォームの送信後、セッションは期限切れになり、ユーザーは再度ログインする必要があります

これはコードの問題ではありません

この値をすべてのページの上部に設定します

ini_set('session.gc_maxlifetime', 18000);

セッションが期限切れになるのを防ぐために、テストフォームでページをリロードせずに10分でセッションを更新する方法はありますか?

私を助けてください

ありがとう

22

JavaScript XHRを使用することも、他の人が呼び出すようにAJAXを使用することもできます。

Ajaxを使用すると、10分ごとにセッションを更新するphpスクリプトを呼び出すことができます。 :)


これは、「正確」にできる限りです。

javascript

var refreshSn = function ()
{
    var time = 600000; // 10 mins
    settimeout(
        function ()
        {
        $.ajax({
           url: 'refresh_session.php',
           cache: false,
           complete: function () {refreshSn();}
        });
    },
    time
);
};

refresh_session.php

<?php
session_start();

// store session data
if (isset($_SESSION['id']))
$_SESSION['id'] = $_SESSION['id']; // or if you have any algo.
?>

とにかく、別の解決策は、ここに提示された解決策のみを使用して、テストページのセッション時間を延長することです。

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

31
gianebao

必要なのはこれだけです($ .postにjQueryを使用):

JavaScript(onload-functionまたは何かの中にこれを置きます)

_setInterval(function(){$.post('path/to/refresh_session.php');},600000); //refreshes the session every 10 minutes
_

refresh_session.php

_<?php
  session_start();

  if (isset($_SESSION['token'])) { //if you have more session-vars that are needed for login, also check if they are set and refresh them as well
    $_SESSION['token'] = $_SESSION['token'];
  }
?>
_

(これは受け入れられた答えとほとんど同じであることを知っています、私は本当にその答えにコメントしたかったのですが、まだ十分な評判がありません。
最大の変更はJavaScriptにあります。関数全体は必要ありません。1行だけです。)



追加情報:

Phpでsession_start()を呼び出すだけで十分だと思いますが、この権利を読んだ場合( http://nl3.php.net/function.session-start ):

読み取りコールバックは既存のセッションデータ(特別なシリアル化形式で格納されている)を取得し、読み取りコールバックが保存されたセッションデータをPHP =セッション処理。

また、テスト中は、上記のコードをビジターページにのみ配置し、管理ページには配置しません。しかし、私は両方のページを同じブラウザ(Chrome)で開いており、管理ページも少なくとも1時間以上ログインしたままになっています(もうチェックしませんでした)。 しかし、セッション変数をまったく手動で更新せずに、session_start()のみを使用した場合でも動作するかどうかはわかりません。

いずれにせよ、私が必要とするセッション変数が本当にまだあることを確認したいです:)

11
myfunkyside