27

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

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

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

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

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

ini_set('session.gc_maxlifetime', 18000);

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

私を助けてください

ありがとう

4

2 に答える 2

39

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
);
};

// Call in page
refreshSn()

refresh_session.php

<?php
session_start();

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

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

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

于 2012-09-26T08:12:35.510 に答える
15

必要なのはこれだけです($ .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 you have more session-vars that are needed for login, also check 
  // if they are set and refresh them as well
  if (isset($_SESSION['token'])) { 
    $_SESSION['token'] = $_SESSION['token'];
  }
?>

最大の変更点はJavaScriptにあります。関数全体は必要なく、1行だけです。


追加情報

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

読み取りコールバックは、既存のセッションデータ(特別なシリアル化された形式で保存されている)を取得し、シリアル化されていない状態で、保存されたセッションデータをPHPセッション処理に戻すときに$_SESSIONスーパーグローバルに自動的に入力するために使用されます。

そして、テスト中、私は上記のコードを訪問者ページにのみ配置し、管理者ページには配置しませんでした。しかし、両方のページを同じブラウザ(Chrome)で開いて、管理ページも少なくとも1時間以上ログインしたままにしました(これ以上チェックしませんでした)。 ただし、session-varを手動で更新せずに、を使用するだけで機能するかどうかはわかりません。session_start()

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

于 2014-05-15T21:58:32.273 に答える