【问题标题】:require_once action when browser reopened (Firefox?)重新打开浏览器时的 require_once 操作(Firefox?)
【发布时间】:2016-02-12 19:40:43
【问题描述】:

我有一个奇怪的情况,当我早上重新打开 Firefox 时,页面上出现 PHP 错误,因为使用了会话变量但未定义。

浏览器设置为重新打开打开的选项卡,生成页面输出的 PHP 脚本以 require_once 开头,该脚本被调用以确保会话已启动并为站点设置会话变量。

白天这工作得很好,但是早上第一件事,当我重新打开浏览器并单击选项卡时,2 个询问会话变量的“if”表达式会抛出错误,因为这些会话变量没有定义。

它们是在 require_once 脚本中“无条件”定义的,所以我假设如果页面被浏览器重新加载,则假定脚本已经加载并且没有重新执行,但是会话没有启动.

我找不到任何描述这个问题的相关文章,而且由于我每天只能“轻松”测试一次,我认为最好问问大师。


根据要求,添加示例代码...

首页顶部

// Include Site Configuration And Global Functions
require_once 'thissite.php';

echo <<<HTML

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>My Company - B2B Trade Stockist Sign In</title>
HTML;

include'head.php';

echo <<<HTML

</head>
<body>
<div class="container padding-10" style="text-align:center;">
    etc......

HTML;

head.php 的一部分,用于输出页面头部部分

if ($_SESSION['ZEN_DESK'] == "on") {
    echo <<<HTML

<!-- Start of Zendesk Widget script -->
code removed
<!-- End of Zendesk Widget script -->

HTML;
}

控制站点设置的thissite.php的一部分

// Ensure session started
if (!session_id()) {
    session_start();
}

//  Zen Desk:
//      This allows you to control whether Zen Desk is active for a site.
$_SESSION['ZEN_DESK'] = "off";  //(on/off)

在白天的正常情况下,当页面加载时,会定义会话变量 ZEN_DESK。但是,如果在一天结束时关闭浏览器并打开选项卡,当早上单击选项卡时,我会记录一个 PHP 错误,因为未定义 ZEN_DESK。

【问题讨论】:

  • 好吧,你能把你正在使用的代码贴出来吗?猜错很难解决
  • 你保持什么条件来测试会话?我的意思是,检查if isset($_SESSION) &amp;&amp; $_SESSION !='')
  • 我“预计”每次加载页面时都会执行 thissite.php,但如果在重新加载浏览器后单击选项卡,似乎不会。也许即使会话已经过期,页面仍然打开的事实不会导致 thissite.php 再次被执行?

标签: php session session-variables session-cookies


【解决方案1】:

一个 php 会话的生命周期通常为 1440 秒(24 分钟)。如果会话在该时间段内没有刷新(例如通过加载/重新加载网页),所有会话变量都将被删除。

要查看服务器上的生命周期有多长,请查看 ini 值 session.gc_maxlifetime

echo ini_get(session.gc_maxlifetime');

phpinfo();

然后搜索session.gc_maxlifetime

【讨论】:

    【解决方案2】:

    如果您使用 cookie 来存储会话变量,请检查它们的生命周期。克服这种情况的一种方法是,如果服务器端变量未过期,则在页面加载时刷新这些 cookie。第二种方法是在存储时延长 cookie 的生命周期。

    【讨论】:

    • 我们在这种情况下使用 PHP 会话变量,但我们也使用 cookie。我注意到(至少使用 Firefox 和 Chrome)如果我将浏览器设置为使用上次的标签打开,即使我们网站的大多数 cookie 被定义为会话 cookie,它们仍然日复一日地保持设置。跨度>
    • 您需要将客户端与服务器变量进行匹配以加强会话安全性。不要相信cookies。但不要避免使用它们。也许使用会话令牌将有助于匹配它们。并且一旦其中一个 cookie 或服务器会话过期,就可以使用剩余的数据相互补充。您是否尝试从服务器访问“剩余”cookie?它可能会提示问题所在。
    • 我已经尝试检查其他会话变量,有些似乎确实存在。只要页面在加载时执行“thissite.php”,就应该确保有会话并初始化关键变量。问题是当标签打开时,第二天早晨,当我打开浏览器时,似乎并没有执行此操作,因此未检查会话。我将在“thissite.php”中添加一个“echo”,看看它是否被执行。
    猜你喜欢
    • 2017-06-25
    • 2023-04-06
    • 2016-10-12
    • 2013-03-06
    • 2014-03-10
    • 2017-04-05
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多