【问题标题】:PHP Session storing behavior into variables?PHP Session将行为存储到变量中?
【发布时间】:2013-11-23 22:58:33
【问题描述】:

这只发生在 Chrome 中

有没有人体验过将函数行为存储到变量中的 PHP 会话?我创建了以下脚本:

<?php
    session_start();

    $_SESSION['count'] = (isset($_SESSION['count'])) ? $_SESSION['count'] + 1 : 0;

   echo $_SESSION['count'];
?>

您会认为这会在每次页面加载时回显 0、1、2、3 等。但是,我得到 1、3、5、7 等等。我发现由于某种原因,$_SESSION['count'] 的行为就像它的递增行为已存储在变量中一样。它似乎在每次页面加载时增加 2 的原因是因为当调用 $_SESSION['count'] 时,它会自动增加 1。为了清楚起见,以下脚本将在每次页面加载时输出更高的数字。

<?php
    session_start();

    echo $_SESSION['count'];
?>

这将回显 $_SESSION['count'] 的任何值,然后在每次页面加载时回显 $_SESSION['count'] + 1。我尝试取消设置会话,清除 $_SESSION 变量,并使用相同的脚本在各个目录中创建新文件。我也在http://codepad.viper-7.com/ 上试过,它工作正常。任何人都知道为什么会发生这种情况?我今天在将会话变量设置为随机数时遇到了类似的行为。在每次页面加载时,我只需通过回显变量即可获得一个新的随机数。当我序列化或 var_dump 变量时,它只是返回一个字符串值。

这是我用来取消会话的:

$_SESSION = array();
session_unset();
session_destroy();

我已经在多个浏览器上尝试过该脚本。 IE 和 Firefox 正确地递增 1;但是 Chrome 增加了 2。知道为什么浏览器会影响这一点吗?

编辑:如果我创建一个新脚本并更改变量,它可以正常工作。我注意到的是,每当我需要 index.php 中的这个脚本时, index.php 只是有 ,我又开始遇到这个问题。所以,index.php 出了点问题。我的 .htaccess 多次加载页面会不会有问题?这里是:

我的 .htaccess 选项 +FollowSymLinks

RewriteEngine on
RewriteBase /

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

DirectoryIndex /index.php
FallbackResource /index.php

#Allow cross domain AJAX
Header set Access-Control-Allow-Origin *

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

再次编辑:根据用户 2086860 在 cmets 中的请求,我将运行完整的代码流。

首先,我使用以下代码创建一个脚本:

 <?php
     session_start();

     $_SESSION['counter'] = (isset($_SESSION['counter'])) ? $_SESSION['counter'] + 1 : 0;

     echo $_SESSION['counter'];

 ?>

此代码按预期工作,打印 0、1、2、3 等。

现在,如果我像这样通过 index.php 需要这个脚本:

<?php
    require 'test6.php';
?>

数字开始增加 2 而不是 1。正是通过我的 index.php 的要求导致了问题。它还搞砸了我的脚本文件,因此直接访问 test6.php 现在增加了 2 而不是 1。您可以在此处看到它的实际效果:

测试网址已移除

我很清楚,上面的代码是我的所有代码。 index.php 或 test6.php 中没有其他内容。这仅在 Chrome 中发生。 Firefox 和 Internet Explorer 工作正常,递增 1。

【问题讨论】:

  • 如何清除会话?你确定你清除了吗?使用 unset() 或 session_destroy()
  • 您确定没有两次调用或包含脚本吗?
  • 我在codepad.viper-7.com/wsm3re 上尝试了您的确切代码,它输出 0、1、2、3 等。
  • 这里没有发生“参考”行为,也没有“[a] 行为 [that] 已存储在变量中”。因此问题一定出在其他地方。
  • 您没有任何浏览器扩展可以使您的请求翻倍吗?

标签: php google-chrome session session-variables


【解决方案1】:

Chrome(显然还有其他浏览器)正在寻找一个网站图标,或者显示在页面标题旁边的图像。只要我像这样向我的页面添加库存图片:

<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" 
  type="image/png" 
  href="https://mysite.com/icon.png">
</head>

成功了。感谢@dev-null-dweller 提出这个建议!

【讨论】:

  • 不要只添加网站图标图像。您也必须修复您的 htaccess。这只是意味着您的 htaccess 占用了您的所有流量并为任何 404 请求运行 index.php。
  • 也许将您的计数器代码移出 index.php 并移到其他 php 文件中。但这又取决于您的应用程序的主要逻辑...
  • @fedmich,对不起,我不清楚。 .htaccess 中需要更改哪些内容?
  • 有时一些爬虫会扫描root上的robots.txt。这意味着如果它在 index.php 中,它将使您的计数器函数再次运行,还有更多可能的“模式”。所以你的 htaccess 不能占用所有 404 请求。
  • @fedmich 我明白了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 2021-09-07
  • 2011-04-26
  • 2017-07-27
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
相关资源
最近更新 更多