1

何ヶ月もの間、次のコードを問題なく使用して、サイトの一意のセッションを追跡してきましたが、最近、不明な理由で機能しなくなりました。別のファイルでコードをテストすると、最初に意図したとおりに機能します。

このコードは、セッションが存在するかどうかを確認し、存在しない場合はセッションを作成して TRUE に設定します。次に、セッションが TRUE であるかどうかを確認するために 2 回目のチェックを実行します。その後、FALSE に変更され、ヒットがデータベースに保存されます。これは、セッションごとに 1 回発生します。

これを実現するコードは次のとおりです。

<?php

session_start();

// If the session DOES NOT EXIST, make it and set it to TRUE.
if(!isset($_SESSION['new_visit']))
{
    $_SESSION['new_visit'] = true;
}

// If the session is TRUE, make it false.
if($_SESSION['new_visit'] == true)
{       
    $_SESSION['unique_session_id'] = hash("sha512", uniqid("", true) . uniqid("", true) . uniqid("", true));

    $_SESSION['new_visit'] = false;
}

echo $_SESSION['unique_session_id'];

このコードを実行すると、予想どおり、ページを何度更新しても出力は変わりません。各ステートメントは 1 回だけ実行されるため、'unique_session_id'変数は常に変更されません。ifただし、私の製品コードにはこの正確なコードが含まれていますが、突然機能しなくなりました。私の生産コードはこれです:

<?php

if(empty($article_data))
{
    $no_article = true;
}

$options        = $this->db->get_options();
$server_options = $this->db->server_options();

// Check site status (on/off).
if($options['status'] == "off")
{
    echo $options['offline_message'];

    exit(); // Equal to die.
}

if($server_options['force_ssl'] == "on")
{
    if($_SERVER["HTTPS"] != "on") 
    {
        header("HTTP/1.1 301 Moved Permanently");
        exit(header("Location: https://" . $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"]));
    }
}

$this->db->store_hit();
$this->db->store_ip();

//----------------------------------------------------------------------------------------------------------
// Store visits (individual sessions). Visits are not unique hits. Visits are the number of unique sessions,
// so a single person may accumulate many visits (sessions), i.e., returning users.
//----------------------------------------------------------------------------------------------------------

// If the session DOES NOT EXIST, make it and set it to TRUE.
if(!isset($_SESSION['new_visit']))
{
    $_SESSION['new_visit'] = true;      
}

// If the session is TRUE, make it false.
if($_SESSION['new_visit'] == true)
{
    $this->db->store_visit();

    $_SESSION['unique_session_id'] = hash("sha512", uniqid("", true) . uniqid("", true) . uniqid("", true));

    $_SESSION['new_visit'] = false;
}

?><!DOCTYPE html>
<html>

...

</html>

ご覧のとおり、このコードは同じですが、ページを更新するたびにunique_session_id変数が変更されます。これは、ロジックが影響を受けていなければ不可能です。私の唯一の結論は、ページの更新の間にセッションが削除されているか失われているということです。

:

  • 私はゼロから書いたMVCパターンを使用しています。
  • session_start()の PHP の他の行の前に呼び出されてい index.phpます。
  • session_start()セッションが作成される直前など、ファイル内のさまざまな場所に移動しようとしました。これは何もしません。
  • を使ってみましたがsession_write_close()、うまくいきません。

2 つの論理ステートメントは、ページの更新回数に関係なく、セッションごとに 1 回だけ実行する必要があり、この方法で 2 ~ 3 か月間動作しています。ページが更新されるたびに突然実行が開始されたのはなぜですか? ページが更新されるたびにロジックが TRUE と評価されるセッション変数に何が起こっていますか?

編集

セッションの問題は、Web ホストから新しい php.ini ファイルを要求することで修正されました。

4

2 に答える 2

1

あなたのコードはあなたが書いたように機能します。コードのコメントを見てください。

if(!isset($_SESSION['new_visit'])) //1st time is not set so enter's to statement
{
    $_SESSION['new_visit'] = true;    //making  $_SESSION['new_visit'] true
}

if($_SESSION['new_visit'] == true) //1st time its true
{
    $this->db->store_visit();
    $_SESSION['unique_session_id'] = hash("sha512", uniqid("", true) . uniqid("", true) . uniqid("", true));
    $_SESSION['new_visit'] = false; //You make it false
}

ただし、$_SESSION['new_visit'] が false の場合は、$_SESSION['new_visit'] が設定されていることを意味します。今2回以上:

if(!isset($_SESSION['new_visit'])) //variable is set, and it will not enter here
{
    $_SESSION['new_visit'] = true; // variable stays false
}

if($_SESSION['new_visit'] == true) //variable is false !!!
{
    $this->db->store_visit();
    $_SESSION['unique_session_id'] = hash("sha512", uniqid("", true) . uniqid("", true) . uniqid("", true));
    $_SESSION['new_visit'] = false; 
}
// Finally $_SESSION['unique_session_id'] stays same.

unset($_SESSION['new_visit']);または、このステートメントのみまたは 1 ページのチェックインにのみ使用する場合$new_visitは、そのためにセッションを使用しないように変数を使用できます。

于 2013-03-09T22:06:02.767 に答える
0

更新しました:

この特定のセッション処理コードを、すべてのファイルで最初に必要な別のファイルに保存します。

セッション ID を取得するには、少なくとも 1 回はリロードする必要があることに気付きました。

if(!isset($_SESSION['new_visit']))
{
    $_SESSION['new_visit'] = true;
    $_SESSION['unique_session_id'] = hash("sha512", uniqid("", true) . uniqid("", true) . uniqid("", true));
}
echo $_SESSION['unique_session_id'];

私はまた、あなたが session_start() を適切に使用していないこと、およびこれまでに行ったすべてのファイルの先頭にあることを推測しています。それを持っていないか、それを間違って使用している単一のページを入力すると、物事は台無しになります。


注:使用できます

session_destroy();

設定されているすべてのセッションを削除します。使用することもできます

unset($_SESSION['new_visit']);

特定のセッションの設定を解除します。

于 2013-03-09T22:16:02.740 に答える