php session_start包含文件

时间:2011-08-02 15:09:07

标签: php session

我从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_start每次我都想使用会话变量。)

5 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:9)

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

答案 2 :(得分:7)

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

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

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

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

这样,你就会有一个与初始化脚本相似的配置文件夹,或者至少在某些文件夹中有 include 文件,这些文件包含在所有页面/脚本中。

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

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

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

答案 3 :(得分:6)

  

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

答案 4 :(得分:1)

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

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

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

希望这能更清楚地说明情况。

詹姆斯重新使用isset的重要提示。这样可以防止尝试无意义的会话呼叫。

另请检查php.ini文件中的session.auto_start var。如果将其设置为1,则将运行所有文件,就好像它们进行了session_start()调用一样。如果你想自己控制它,请在php.ini文件中将其设置为0。