X
pm studio world wide news pj club
pm studio world wide news pj club
news, tech, music, film, sports, cg, translation, photo uploader
  • 2016-01-17
  • PJ Club
  • How to set timeout of Session more longer in PHP / PHPでセッションの有効時間を延長する方法
  • FacebookやTwitter等のSNSで必ず目にするのが、ログインページです。IDとパスワードを入力すると、そのサイト内のどのページに移動しても、ちゃんとIDとパスワードが有効になっています。これは、セッション(session)機能の賜物です。
    セッション機能とは、サーバー側で発行されるセッション変数に必要な要素(IDやパスワード等)を記憶するもので、同じサイトであれば、どこのページからでも、セッション変数を呼び出す事が出来ます。セッション変数はサーバー側に保存されます。
    クッキー(Cookie)との違いは?クッキーは、ユーザーのブラウザー、つまりクライアント側でデータを保存する変数です。
    このセッション機能は、あらかじめ有効時間が設定されていて、一定時間が過ぎるとセッションが切れます。
    デフォルトのセッション有効時間は24分(1440秒)です。
    実際、更新型のWebサイトで管理画面からデータを記述し、さあ、アップしようとした時、タイムアウトとなり突然ログイン画面に戻されたりすると、びっくりしますね。
    では、どうすればセッション有効時間を延長出来るのでしょう?ネットでも、この有効時間の延長方法がよく質問されています。
    方法は3つです。

    1. PHPの初期ファイルphp.iniを変更する。
    2. .htaccessファイルを使用する。
    3. PHPのスクリプトで変更する。

    1. PHPの初期ファイルphp.iniを変更する。

    1番目のphp.iniファイルを変更ですが、SSHでサーバーにログインし、php.iniファイルを編集します。(ログイン方法の解説は省きます)
    編集前にcpコマンドでバックアップを作成します。

    cp /etc/php.ini /etc/php.ini.org

    php.iniを編集する場合は、下記コマンドを実行します。

    vi /etc/php.ini

    phpの内容を書き換えるところは下記です。

    session.gc_maxlifetime = 1440

    これを

    session.gc_maxlifetime = 3600

    にします。
    これで1時間に変更出来ました。
    変更を保存します。保存は「:w」また「:wq」をタイピングします。
    下記コマンドでサーバーをリスタートします。

    service httpd restart

    phpinfo( )関数を使ってとphp.iniファイルの内容を確認できます。
    PHPのスクリプトを下記のように記述し、サーバーにアップするとphp.iniファイルへの内容が表示されます。

    <?php
         phpinfo();
    ?>

    session.gc_maxlifetimeが3600となっていれば、OKです。

    2. .htaccessファイルを使用する。

    一般的な共有サーバーは、専用サーバーと違い1番のphp.iniを変更出来ないようにしているところが多いです。php.iniの変更はSSH経由で行います。SSHでアクセスすると、PHP以外の初期設定も変更出来るためだと思います。
    php.iniを変更出来ない場合は、2番目の方法を使用します。
    有効時間を24分から1時間にしたければ、60秒 x 60分=3600秒とし、下記をhtaccessファイルに記述します。

    php_value session.gc_maxlifetime 3600
    php_value session.gc_probability 1
    php_value session.gc_divisor 100

    session.gc_maxlifetimeは、有効時間です。単位は秒です。
    session.gc_probabilityとsession.gc_divisorは、session.gc_probabilityを分子、session.gc_divisorを分母として、1/100の確立で有効時間前のセッションデータを削除します。つなり100回に1回です。もっと頻繁にしたい場合、数値を100以下に指定します。デフォルトは100です。
    通常は、ファイルをhtaccess.txtと保存し、FTPでサーバーにアップ後、ファイル名を.htaccessに変更します。

    3. PHPのスクリプトで変更する。

    共有サーバーによってはhtaccessファイルにも制限をかけている場合があり、セッション有効時間を変更出来ません。
    この場合、3番目の方法を使用します。下記のようにPHPのスクリプトを記述します。

    ini_set("session.gc_maxlifetime","3600");
    ini_set("session.gc_probability","1");
    ini_set("session.gc_divisor","100");

    これで、有効時間が1時間に変更されます。
    現在の有効時間を知るには、ini_get("session.gc_maxlifetime");とすることで取得出来ます。
    まとめると、

    <?php
         ini_set("session.gc_maxlifetime","3600");
         ini_set("session.gc_probability","1");
         ini_set("session.gc_divisor","100");

         echo ini_get("session.gc_maxlifetime");
    ?>

    3600と数値が表示されれば、OKです。
    ところで、共有サーバーは他のユーザーもPHPを使用しおり、各ユーザー毎にセッション設定をしいています。
    そこで、セッション変数を保存するディレクトリーを指定し、他のユーザーのセッション変数と混同しなようにします。
    共有サーバーの場合、この保存先を指定してやらないと、セッション有効時間の延長がうまく変更出来ないケースもあります。
    通常、セッション変数の保存先を指定していない場合、"/tmp/"に保存されています。この保存先を別の保存先ディレクトリーに変更します。
    特定のディレクトリーに新たなフォルダーを作成し、保存先名を付けます。
    一般的に多いのが、varディレクトリーのtmpディレクトリーを使用します。その場合、"/var/tmp/新しいディレクトリー名"とします。
    何故、"/tmp/"以下に保存作を作成しないかと言いますと、サーバー再起動時に/tmp以下が全て削除されてしまうため、varディレクトリ以下を使用します。
    しかし、この"/var/"が非表示、アクセス出来ない共有サーバーの場合、新しい保存先を作れませんから、FTPで特定の場所に新たなフォルダーを作成し、そこを指定する事も可能です。
    但し、誰でもアクセス出来てしまうと危険ですから、セキュリティ上の設定をしておく必要があります。
    変更には、session_save_path(保存先ディレクトリー名)関数を使用します。尚、ディレクトリー記述は相対パスです。
    記述は下記のように必ずsession_start( )の前に記述します。

    <?php
         session_save_path("/var/tmp/保存先ディレクトリー名");
         session_start();
    ?>
  • 時間延長のテストを作成

    では、3番目の方法で簡単な時間延長のテストを作成してみます。デフォルト1440秒の状態から3600秒(1時間)に延長し、60分経過したらタイムアウトします。
    まず、テスト用のディレクトリー「test」を作成します。次にセッションスタート用ファイルsession_start.php、続いてセッション確認用のsession_test.php、セッション終了用のファイルsession_end.phpの3つのPHPファイルを作成します。

    session_start.php
    下記は、session_start.phpのスクリプトとHTMLです。

    <?php
         if($_SERVER["REQUEST_METHOD"] != "POST"){
         } else {
              $value =htmlspecialchars($_POST["start"],ENT_QUOTES);
              if(!isset($value) || $value===""){
                      $errorMSG="ERROR";
              }
              if (!$errorMSG){
                  //セッッションの保存先指定
                  session_save_path("/var/tmp/保存先ディレクトリー名");
                  session_start();
                  session_regenerate_id(true);
                  $_SESSION["testTime"] = time();
                  //Cookieの設定
                  setcookie(session_name(), session_id(), 0, '/test/');
                  header("Location: ./session_test.php");
                  exit;
              }
         }
    ?>
    //HTML部分
    <form method="post" action="session_start.php">
         <input id="submit" type="submit" name="start" value="start">
    </form>

    フォームの「start」ボタンをクリックするとセッションがスタートします。
    セッションはCookieを併用します。session_start()が実行されるとサーバーはセッション変数をCookieに送信します。
    スクリプト内のsetcookie(session_name(), session_id(), 0, '/test/')は、Cookie変数の設定です。0としているのはCookieの有効期間をブラウザーが閉じるまでとしています。
    一定の有効時間を設定したい場合、time()+設定時間(秒)で変更出来ます。

    setcookie(session_name(), session_id(), time()+設定時間(秒), '/test/')

    '/test/とあるのは、今回作成したテスト用のディレクトリー「test」のみでCookieが動作するようにするものです。
    ディレクトリー指定がない場合、すべてのディレクトリーでCookieが動作します。
    セッションCookieには、session_set_cookie_params( )関数がありますが、この関数を使用する場合は、session_set_cookie_params(0, '/test/')と記述します。
    但し、この関数は必ずsession_start( )前に記述しなければなりません。また、セッション有効が複数のページにまたがる場合、ページ毎に記述します。
    しかし、今回は、setcookie( )関数を使用していますので、session_set_cookie_params( )関数は必要ありません。setcookie( )関数が先に設定されている場合、session_set_cookie_params( )関数は有効にならないからです。
    session_regenerate_id(true)は古いセッション情報を削除します。セッションハイジャック(Session Fixation攻撃)対策の一つです。
    $_SESSION["testTime"] = time()は、testTimeと言うセッション変数にスタートした時間を保存しています。

    session_test.php
    続いて、session_test.phpですが、1時間経つと、session_end.phpへ移動するボタンが表示されます。
    セッションに保存されているスタート時間を現在の時間から差し引くと経過時間が分かります。経過時間が3600秒(1時間)であれば、ボタンが表示されます。
    ただし、PHPはサーバー側のプログラムですから、JavaScriptと違いクライアント側での操作が出来ません。そのため、一度表示されるとそのままの状態です。時間経過を見るには、session_test.phpをリロードする必要があります。
    テストで1時間も待ってられないと言う場合、if($spendTime>3600)の数値を小さく、例えば、300とすると5分でボタンが表示されます。
    逆に数値を大きく7200として2時間にしても、セッションの有効時間が1時間に設定されていますので、1時間経過するとボタンが表示されます。
    ボタンをクリックするとsession_end.phpへ移動し、セッションを終了します。
    スクリプトは下記のように記述します。
  • <?php
         session_save_path("/var/tmp/保存先ディレクトリー名");
         //セッションの有効時間を1時間に設定
         ini_set("session.gc_maxlifetime","3600");
         ini_set("session.gc_probability","1");
         ini_set("session.gc_divisor","100");
         session_start();
         //セッションがスタートした時間を取得
         $oldTime=$_SESSION["testTime"];
         if(isset($oldTime)){
              //現在の時間を取得
              $nowTime=time();
              //スタートからの経過時間を算出
              $spendTime=$nowTime-$oldTime;
              //タイムアウトまでの時間を算出
              $spendMinutes=round($spendTime/60);
              $spendMinutes=($spendMinutes-60)*-1;

              if($spendTime>3600){
                  //スタートから1時間経過したらボタンを表示
                  $goBtn="<a href='session_end.php'><input id='nextBtn' type='button' name='next' value='go to end page'>";
              } else {
                  //タイムアウトまでの時間を表示
                  echo $spendMinutes." minutes remaining";
              }
         }
         echo $goBtn;
    ?>

    session_end.php
    最後にsession_end.phpですが、セッションを破棄すると、最初のスタートページへ戻るボタンが表示されます。
    セッションの破棄を実行をすると、あらかじめ設定していた保存先ディレクトリーからセッション変数のファイルを削除してくれます。
    セッションの破棄は、次の3つが必須です。

    1.セッション変数の初期化
    2. Cookieの変数の初期化
    3 セッション変数ファイルの削除

    まず、セッション変数の初期化ですが、変数名を指定して初期化する場合は、下記のように記述します。

    unset($_SESSION["セッション変数名"])

    全てのセッション変数を初期化するには、下記のようにします。

    $_SESSION = array();

    続いて、Cookieの変数の初期化です。下記のようにします。

    setcookie(session_name(), '', time()-42000, '/test/');

    time()-42000は、現在の時間から過去に設定されたCookieを削除します。現時点より過去であればいいので、42000にあまりこだわる必要はありません。
    最後にセッションの削除ですが、下記のように記述します。

    session_destroy();

    これで、保存先からセッション変数のファイルを削除します。
    まとめると、

    <?php
         session_save_path("/var/tmp/保存先ディレクトリー名");
         session_start();
         //セッション変数の初期化
         unset($_SESSION["testTime"]);
         //Cookieの削除
         setcookie(session_name(), '', time()-42000, '/test/');
         //セッションの破棄
         session_destroy();
         //スタートページへ戻るボタン表示
         $backBtn="<a href='session_start.php'><input id='nextBtn' type='button' name='next' value='back to start page'>";
         echo $backBtn;
    ?>

    WebではCookieを使用したセッション有効時間の延長方法がよく掲載されています。
    今回であれば、session_test.phpのsession_start()後に記述します。

    setcookie(session_name(), session_id(), time()+延長時間(秒単位), '/test/');

    しかし、これは、Cookieの有効期間が長くなっただけで、セッション時間の延長にはなりません。
    確実に延長したい場合、今回のテストのようにsession.gc_maxlifetimeを変更する必要があります。
  • source : pm studio world wide news
Recent Post
Latest News
Billboard Hot 100
Top 10
  • No.1
    In My Feelings
    Drake
  • No.2
    I Like It
    Cardi B, Bad Bunny & J Balvin
  • No.3
    Girls Like You
    Maroon 5 & Cardi B
  • No.4
    Nice For What
    Drake
  • No.5
    Boo'd Up
    Ella Mai
  • No.6
    God's Plan
    Drake
  • No.7
    Lucid Dreams
    Juice WRLD
  • No.8
    Don't Matter To Me
    Drake & Michael Jackson
  • No.9
    Psycho
    Post Malone & Ty Dolla $ign
  • No.10
    The Middle
    Zedd, Maren Morris & Grey
BBC Radio 1 Singles 40
Top 10
  • Don't Matter To Me (feat. Michael Jackson)
  • No.5
    "Don't Matter To Me (feat. Michael Jackson)"
    Drake
  • Editor: Toshio Maeoka / pm studio
    pm studio world wide news © 2014-2018 . All Rights Reserved
^
to TOP