何ヶ月もの間、次のコードを問題なく使用して、サイトの一意のセッションを追跡してきましたが、最近、不明な理由で機能しなくなりました。別のファイルでコードをテストすると、最初に意図したとおりに機能します。
このコードは、セッションが存在するかどうかを確認し、存在しない場合はセッションを作成して 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 ファイルを要求することで修正されました。