Session_start() 定义常量后

Session_start() after defining a constant

在每一页上(第一行,第一行代码)我有这两行代码:

define("DIRECT_ACCESS", true);
defined("DIRECT_ACCESS") OR die(header("Location: https://website.com/"));

在那两行代码之后,我总是做 session_start();,我读到 session_start() 应该作为第一件事,在任何事情之前。 Session_status() 显示会话处于活动状态并且工作正常,所以我有几个问题:

1.如果它应该是第一行,在其他代码之前,为什么会话有效?
2。如果我不把 session_start() 作为第一行代码,会不会有什么危险的事情发生?

感谢您花时间帮助我。

I read that session_start() should come as a first thing, before anything.

这种说法基本上是错误的。

初始化 sessions 时需要考虑一些事项:

  1. 使用默认(推荐)设置,session ID 通过 cookie 传输。 Server-side cookie 是通过 HTTP headers 设置的。需要在响应 body 之前发送 HTTP headers。因此,您需要避免这样的结构:

    echo 'Hello, World!';
    session_start();
    
  2. 您不能使用 session 从永久存储中检索数据之前的数据。这正是 session_start() 所做的。所以你不能这样做:

    $user_name = $_SESSION['user_name'];
    session_start();
    
  3. 有时您可能想关闭 session 以解锁存储。你用 session_write_close() 来做到这一点。执行此操作后,session 数据仍处于加载状态,但更改不会持续存在。所以请避免:

    session_write_close();
    $_SESSION['user_name'] = 'john.doe';
    

除此之外,您可以随时开始 sessions。