【问题标题】:php session_start with include files带有包含文件的 php session_start
【发布时间】:2011-08-02 15:09:06
【问题描述】:

我从previous question 学到了很多关于会话开始的知识。现在我想知道当文件包含在其他文件中时如何发生会话锁定。假设我有:

page.php

include('header.php');
...some html content....
include('sub_page.php');
...more html....

header.php:

session_start();
..save session vars...
..print web page header...

sub_page.php

session_start();
...use session vars....
..print page content...

当我打开 page.php 时,会话是否会在 header.php 完成后立即解锁?还是它在整个 page.php 生命中都存在,所以 sub_page 的会话被阻止? sub_page 中的session_start 是否必要?如果每次我完成会话数据时我 session_write_close 会更好吗? (虽然这意味着session_starting 每次我想使用会话变量)。

【问题讨论】:

  • 因此将所有这些答案放在一起,因为包含只是检索文件并将其转储,就好像它是 page.php 的一部分一样,第二个 session_start 不是有效的语句,所以锁定不是一个问题。

标签: php session


【解决方案1】:
  1. 您应该只开始一次会话。在您的示例中,只需要在 page.php 的第一行使用 session_start()
  2. session_start() 如果之前启动了会话,将生成 E_NOTICE。你可以使用@session_start() 来忽略它。
  3. 如果您在输出 HTML 代码后使用 session_start(),它也会生成 E_NOTICE。

【讨论】:

  • 我在标头中有 session_start,因为标头包含在我的所有页面(page.php、page2.php 等)中。我关闭了 e_notice,所以我没有注意到 (::rimshot::) 警告。
  • 同意 header 中的 session_start,因为您将在每个页面中使用 header.php。编码时不要关闭e_notice,有利于编码修正
【解决方案2】:

由于上面的答案讨论了会话已经开始时的错误,我只想指出你可以这样做:

if (!isset($_SESSION))
  {
    session_start();
  }

然后如果 $_SESSION 已经启动(设置)它不会执行启动功能。

虽然没有什么比结构良好的文件和文件夹布局以及良好的框架设置更好的了。即使只是一个将业务逻辑与表示分离的简单框架结构。

这样,您将拥有类似于带有初始化脚本的配置文件夹的内容,或者至少在某些文件夹中包含所有页面/脚本中的 include 文件。

然后,您只需将session_start() 放入(取决于您的设置)第一个包含文件中,或者在单独的包含文件中,然后在需要时将该会话文件包含在脚本的特定区域中。

无论哪种方式,您都不需要在任何其他文件中调用它,因为您知道根据您的设计结构根本不需要它。

如果您没有始终包含的文件,那么至少使用isset() 检查。

【讨论】:

    【解决方案3】:

    只要您不访问或创建会话变量,您就无需担心 session_start()。如果您正在运行的脚本将创建会话变量,或者依赖访问会话变量来运行,您只需要担心 session_start。

    如果 file1 没有访问或创建变量以供其他脚本使用,则不要调用它。如果 file1 包含的 file2 正在创建或依赖会话中的变量,则 file2 应调用 session_start()。 File2 将包含在会话中,并且能够访问所有会话变量,但 file1 不会。

    如果您在 file1 中调用 session_start(),则 file2 将能够访问所有会话变量,就好像它调用了 session_start()。

    希望这可以进一步澄清情况。

    James 重新使用 isset 的好建议。这将防止尝试无意义的会话调用。

    同时检查您的 php.ini 文件中的 session.auto_start 变量。如果设置为 1,那么所有文件都将像调用 session_start() 一样运行。如果你想自己控制的话,在php.ini文件中设置为0。

    【讨论】:

      【解决方案4】:

      我建议创建一个session.php 文件,您将在每页的第一行包含一次。这样,会话在一个文件中处理,以防您需要更改验证或会话设置(并且不必担心您的问题)。

      【讨论】:

      • 但是当一些子页面需要使用会话变量而一些不需要时会发生什么?
      • @Andrea:我不确定我是否理解。当您包含包含会话信息的session.php 时,它可用于其后包含的所有脚本。
      • 当您说“处理会话”时,您的意思是“与 $_SESSION 变量交互”,包括设置和从中获取?
      • 如果存在会话,您可以从 PHP 代码中的任何位置访问(读取和写入)$_SESSION,只要首先加载了 session.php
      • 我明白了。那么目前 header.php 正在提供该功能。我可以看到将所有会话内容分离到标题包含的自己的文件中会有多好。
      【解决方案5】:

      从 PHP 4.3.3 开始,在会话之前启动之后调用 session_start() 将导致 E_NOTICE 级别的错误。此外,第二个会话开始将被简单地忽略。

      【讨论】:

      • 我关闭了 E_NOTICE,所以我没有看到这个警告。
      猜你喜欢
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      相关资源
      最近更新 更多