4

ランダムにデータを失っている間に、$_SESSION問題が発生しました。$_SESSION

さまざまなページのフォームがあり、ユーザーはすべてのページを通過するための特定の時間があります。

そこで、最初のページでセッション変数を設定し、他のページでそれを確認します。

start.php

 <?php
    session_start();  

    //Set Variable for Starting application
    if (!isset($_SESSION['STARTED'])){
        $_SESSION['STARTED'] = time();
    }

app_init.php

<?php
session_start();

if ((!isset($_SESSION['STARTED'])) || (time() - $_SESSION['STARTED'] > MAX_TIMELIMIT)) {
    echo '<!-- st: '.$_SESSION['STARTED'].'-->';
    // Started Variable is not set or timelimit is over.
    session_destroy();   // destroy session data in storage
    session_unset();     // unset $_SESSION variable for the runtime
    showTimeout('0');   //  show timeout
}

その後のページの開始:

<?php

// get basic settings for applications 
require_once (MODEL_PATH.'/app_init.php');

システム全体は、ローカルインストール、Developmentserver、およびTestserverで非常に正常に機能します。Productionserverでは、さまざまな時間にタイムアウトが発生します。30秒から10分とは異なります。MAX_TIMELIMIT20分です。$_SESSION['STARTED']その場合は常に空です。他の環境では、20分後にタイムアウトが表示されても、正しく設定されています。

追加情報:

  • 次のページに到達しようとしても、実際のページをリロードするだけでも、常にタイムアウトになります。
  • 私はすでに任意の環境をチェックphp.iniしました->session.save_path正しく設定され、session.cookie_lifetime0でsession.gc_maxlifetime1440です
  • ディスクスペースは問題ありません(> 22 GBの空き容量)
  • すべてのファイルは同じサーバー上にあり、同じURLを持っています(フォームのステップを指定する最後の部分を除く。次のようになります:
    host / some / path / calc-> host / some / path / form-> host / some / path / summary-> host / some / path / send
  • セッションは計算ページで設定され、タイムアウトはすべてのページ(計算、フォーム、要約)で発生する可能性があります
  • 本番サーバーからphp.iniを取得し、ローカルワークスペースに取り込みました。いくつかのパス(extensions-path、session.save_path、tmp-path)を変更した後、ローカルインストールで非常にうまく機能しました。
  • プロトコルはすべて同じページです
  • セッションを再作成する(および、を介し$tmpsession_destroy()session_create()は役に立ちませんでした
  • 単一のフロントエンド、ロードバランサーなし(単に​​1つのapache)
  • セッションファイルはどういうわけか削除されます

いくつかの出力を追加して再テストした後、次のようになります。

  • ページをロードします(最初のステップ)
  • フォームから任意のステップ(計算/フォーム/要約)に進みます
  • ページが読み込まれるとき$_SESSION

    array ( 'STARTED' => 1338298801, 'S_SID_' => '41554681145546', 'S_LC_' => 'de', 'version_testing' => 1, )

  • そのページを30秒ごとにリロードします

  • 少なくとも3分後(30秒になることもあります)、タイムアウトが発生し、次のようになり$_SESSIONます。

    array ( )

  • 最初のページでこれを試してみると$_SESSION、sessiondataが空で、自動的に新しい値が設定されるため、で新しい値が取得されます。

  • 覚えておくべきこと:テスト/開発環境では、セッションデータはまだそこにあり、タイムアウトが20分後に発生します。

  • session.save_pathの変更は最初は機能しているように見えました(セッションは少なくとも24分続きます)。しかし、1時間後も、同じ問題が発生します。4分以上続くセッションはありません。

問題が見つかりました(ただし、まだ解決策はありません)
今日、Production-Serverにアクセスでき、Session-Dataのあるフォルダーが3〜5分後にクリーンアップされることがわかりました。タイムスタンプが3分より古いファイルはありません。前述のように、PHPは正しく設定されており(GCライフタイム)、Windowsジョブなど、これらのファイルを削除しているものは見つかりませんでした。PHP.iniが正しく設定されているので、データベースを介してセッションを処理しようとします。

手伝ってくれてありがとう

4

3 に答える 3

3

この特定の状況で機能したもの:

別のWebサイトは、同じサーバー上にあるが別の仮想ホスト内にあるhostetでした。このウェブサイトは、すべてのリクエストで呼び出される「init.php」を使用していました。これには、gc_maxlifetimeを0に設定し、その後セッションを開始する行が含まれていました。そのため、あるリクエストでランダムにすべてのセッションデータがその2番目のWebサイトによってクリアされました。

テストと開発では、これら2つの環境はあまり使用されていないため、問題はありませんでした...

于 2012-05-31T09:38:23.410 に答える
1

これは、PHPWebサイトがロードバランサーを使用して複数のフロントエンドでホストされている場合に何度も見た一般的な動作です。PHPはデフォルトでファイルシステムにセッションを保存するため、どちらのフロントにいるかに応じて、1つまたは別のセッションが開始されます。

簡単な解決策は、セッションをデータベースに保存することです。ロードバランサーについて間違っている場合でも、ファイルシステムでセッションデータを直接読み取って、何が起こったのかを正確に確認する必要があります(PHPはデータを削除していますか?データはまだ残っていますか?ここでは、別のセッショントークンが生成されますか?など)。

于 2012-05-29T14:09:47.053 に答える
0

一見すると(詳細情報なしで)、実際に時間が開始される前にセッションが開始されたように見えます。これは間違いなくこの問題を引き起こすでしょう。それが問題になる可能性がある場合は、これを試してください。

$tmp = $_SESSION;
session_destroy();
session_start();
$_SESSION = $tmp;
$_SESSION['started'] = time();

また、サブドメインなどにアクセスしている場合、セッションはそこに存在しません。設定されたときに存在していた正確なドメインに対してのみ存在します。

もう少し情報を提供することも役立つかもしれません。問題が存在するページのURL。ページにいくつか追加して、var_dump($_SESSION)ステップスルーすると何が出力されるかを確認します。変化に気づいたら、どこで、なぜ変化したのかを理解してください。

于 2012-05-25T15:06:14.233 に答える