Wordpress 会话不断刷新不一致

Posted

技术标签:

【中文标题】Wordpress 会话不断刷新不一致【英文标题】:Wordpress session keeps refreshing inconsistently 【发布时间】:2021-03-25 22:05:02 【问题描述】:

我正在尝试使用以下代码在我的 wordpress 网站上创建访客计数器:

add_action( 'init', 'session_counter' );
function session_counter() 
  $date = date('d/m/Y');
  $session_data = get_option( 'session_counter');
  $session_data['01/12/2020'] = 0;
  $session_counter = 0;
  $session_data_output = '';
  $i = 0;
  if (!session_id()) 
    session_start();
    if($_SESSION['hasVisited'] != '1')
      if(isset($session_data[$date]))
        $session_counter = $session_data[$date];
      
      $session_data[$date] = $session_counter + 1;
      update_option( 'session_counter', $session_data);
      foreach($session_data as $k => $v)
        if($i > 0)
          $session_data_output .= "\n";
        
        $session_data_output .= $k." - ".$v;
        $i++;
      
      $session_counter_txt = fopen("counter.txt", "w");
      fwrite($session_counter_txt, $session_data_output);
      fclose($session_counter_txt);
    
    $_SESSION['hasVisited'] = '1';
  

上面的代码将每天的访问者总数存储在数据库中,然后以可读格式存储在文本文件中。

设置访问者计数器的目的是查看有多少人在同意 GDPR 弹出窗口之前访问了该网站,因为只有在获得同意后才会启用 Google Analytics。该网站使用 CookieYes GDPR 弹出窗口,该弹出窗口也记录了同意。

一切正常,除非我将文本文件与 Google Analytics 和 Cookie 进行比较是的,我发现文本文件中的计数明显高于 Google Analytics 中的计数。例如,文本文件显示的总天数为 11764,而 Google Analytics(分析)显示的总天数为 598。

经过进一步调查,我注意到在文本文件中记录同一网站访问者的次数比在 Google Analytics(分析)中记录的次数少,这让我相信,当同一访问者浏览网站时,网站会话会不断刷新。

如果我清除浏览器历史记录或关闭浏览器,我总是认为会话会刷新,那么为什么同一用户的会话会不断刷新。

我不想按 IP 地址记录会话,因为我想保持 IP 匿名以用于 GDPR。

我的代码存储会话的方式有问题吗?如何防止会话为同一用户刷新?我只希望在访问者关闭浏览器后销毁会话。

【问题讨论】:

【参考方案1】:

根据 Zoli Szabó 的回答,我已将代码更新为以下内容:

add_action( 'init', 'session_counter' );
function session_counter() 
  session_start();
  $date = date('d/m/Y');
  $session_data = get_option( 'session_counter');
  $session_data['01/12/2020'] = 0;
  $session_counter = 0;
  $session_data_output = '';
  $i = 0;
  if($_SESSION['hasVisited'] != '1')
    if(isset($session_data[$date]))
      $session_counter = $session_data[$date];
    
    $session_data[$date] = $session_counter + 1;
    update_option( 'session_counter', $session_data);
    foreach($session_data as $k => $v)
      if($i > 0)
        $session_data_output .= "\n";
      
      $session_data_output .= $k." - ".$v;
      $i++;
    
    $session_counter_txt = fopen("counter.txt", "w");
    fwrite($session_counter_txt, $session_data_output);
    fclose($session_counter_txt);
  
  $_SESSION['hasVisited'] = '1';

我将整天测试它,看看我是否得到了一致的结果,但到目前为止还不错。

更新

我尝试了这个解决方案,现在会话计数每刷新一页就会更新一次。

【讨论】:

不要忘记会话的持续时间是可配置的:***.com/questions/8311320/…【参考方案2】:

在用session_id()查询会话ID之前,你必须先调用session_start(),否则它总是会返回一个空字符串。

会话可能无法启动。检查session_start()的返回值。

如果会话成功启动,此函数返回 true,否则返回 false。

另外,确实没有必要检查session_id() 的空性,因为如果成功,session_start() 将启动一个新会话或恢复现有会话。所以测试$_SESSION['hasVisited']的存在就足够了。

【讨论】:

我尝试了您的解决方案,但它阻止了我录制任何内容 我试过你的解决方案,现在会话计数每刷新一页就会更新一次

以上是关于Wordpress 会话不断刷新不一致的主要内容,如果未能解决你的问题,请参考以下文章

php会话变量不一致

OpenID Connect:不同身份提供者之间的刷新令牌行为不一致

Jupyter Ipywidgets 在显示和刷新时行为不一致

PHP会话的数据在页面重新加载之间不一致 - 但会话ID是相同的

onAuthStateChanged 不一致

onAuthStateChanged 不一致