web-dev-qa-db-ja.com

PHP非アクティブなユーザーのセッションが期限切れになるのを防ぐ

アプリケーションに問題があります。アプリケーションには多くのフォームがあり、フォームが動的であるため(他のフォームを追加できるため)、このフォームが完了するまでに約1時間必要です。問題は、私のWebサーバーのセッションが24分であることです。ユーザーがフォームに入力すると、サーバーがユーザーが非アクティブであることを認識するため、多くの時間を費やし、セッションがタイムアウトしました。フォームが送信され、ほとんどのデータが失われ、ユーザーがログインページに戻ると、非常に煩わしくなります。次のコードを使用して、セッションを10時間で期限切れにしようとしました:

_ini_set('session.gc_maxlifetime', '36000');
_

しかし、私のサーバーでは機能していません。サーバーがini_set()関数を妨げている可能性はありますか?

では、この問題を解決するにはどうすればよいですか?セッションのタイムアウトを防止して、セッションを10時間に拡張できますか?または、セッションの有効期限を無効にできますか?

ありがとう

20
dian

Iniの時間を固定長に設定する代わりに、リロード時にセッションタイムアウトがリセットされることに注意してください。したがって、ファイル(イメージまたはsmth)に対して5分程度ごとにリクエストを実行するajaxコードを作成します。このようにして、タイマーは5分ごとにリセットされ、ユーザーはフォームの入力に1日を費やすことができます。

42
Prikkeldraad

JQuery Ajax呼び出しを使用してセッションタイムアウトを防ぐ例を次に示します。

var refreshTime = 600000; // every 10 minutes in milliseconds
window.setInterval( function() {
    $.ajax({
        cache: false,
        type: "GET",
        url: "refreshSession.php",
        success: function(data) {
        }
    });
}, refreshTime );

refreshSession.phpでsession_start()のようなことができます

32
MDeuerlein

過去にも同じ問題がありました。これを回避するために行ったのは、これらの2つの関数を、すべてのファイルに含まれる構成ファイルに配置することでした。

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

安全のため、.htaccessファイルのこの行を測定します

php_value session.gc_maxlifetime 86400
5
ChazUK

ini_setを使用する前にオプションを変更する限り、session_startを使用してsession.gc_maxlifetimeを変更しても機能します。したがって、次のことを行うとうまくいくはずです。

ini_set('session.gc_maxlifetime', 36000);
session_start();

他のコンテキストでそのオプションを変更することもできます( ChazUKの回答 を参照)。

ただし、Cookieの有効期間を固定値に設定するのではなく、セッションのCookieを実際の セッションCookie にして、ブラウザセッションが終了するまで(つまり、ブラウザを閉じるまで)継続します。これを行うには、session.cookie_lifetime0に設定します。

また、存続期間の計算はセッションデータの最終変更日に基づいているため、 PHPのセッション有効期限モデルは少し風変わりです についても考慮してください。

3
Gumbo

セッションCookieを作成するときに、セッションCookieの持続時間を設定します。 setcookieメソッドを使用する場合、メソッドの引数は、Cookieを持続させるLENGTHです。

追加情報については、PHPメソッドのマニュアルを参照してください: http://php.net/manual/en/function.setcookie.php

0
cbroughton