繁体   English   中英

PHP session_start() 函数:为什么每次使用与 PHP 会话相关的任何东西时都需要它

[英]PHP session_start() function: Why I need it everytime I use anything related to PHP sessions

为了从我的网站注销用户,我将页面重定向到logout.php ,在那里我使用 session_destroy() 函数。 即使在那里,如果没有session_start()函数,注销功能也无法工作。 之前加入session_start()函数session_destroy()函数,我能够成功注销用户。

为什么我每次都需要在每个页面中使用session_start()函数,我正在做与会话相关的事情?

session_destroy() 销毁活动会话。 如果不初始化会话,则不会有任何东西被销毁。

为什么我每次都需要在每个页面中使用 session_start() 函数,我正在做与会话相关的事情?

所以 PHP 知道要销毁哪个会话。 session_start()查看是否存在会话 cookie 或 ID。 只有有了这些信息,你才能摧毁它。

在默认配置中,PHP 会话在硬盘上运行。 PHP 要求您在需要此支持时明确告诉它以避免不必要的磁盘 IO。

session_start()还告诉 PHP 找出用户的会话是否存在。

session_start() 根据通过 GET 或 POST 请求或通过 cookie 传递的会话标识符创建会话或恢复当前会话。

根据http://php.net/manual/en/function.session-start.php

本质上,通过调用session_start() ,PHP 读取标头并将该会话 ID 交叉引用到您的系统(文件系统/数据库/等)上的内容,然后可以填充与该特定用户相关的$_SESSION 这反过来又允许您调用session_destroy()因为它知道要实际销毁哪个会话。

考虑 session_start() 作为你告诉 php 引擎的方式......你想使用会话。

而且,据我所知,始终将其设为 php 页面中的第一行。

我对 session_start() 的用法感到困惑; 每次我使用会话变量时,我都会调用 session_start。 准确地说,我有 session_start(); 每个页面上不止一次(甚至没有调用 session_destroy())。 例如,

// 1st call
session_start();

if (!isset($_SESSION['UserID']))    
{       
    // Do something    
}

else
{
   // Do something else
}

// .... some other code

// 2nd call
session_start();

if (!isset($_SESSION['UserID']))    
{       
    // Do something totally different   
}

else
{
   // Do something else totally different
}

这给我带来了性能问题。 所以我最终调用了session_start(); 仅在页面最顶部一次,一切似乎都运行良好。

您必须在您希望会话工作的每个文件中调用 session_start 一次(并且仅一次)。

允许您只调用一次的常用方法是将调度程序文件作为 index.php; 在此处调用 session_start 并让此页面包含基于 url 的 $_GET 的其他页面。

<?php
    session_start();
    if(isset($_GET['page']) && file_exists('pages/'.$_GET['page'].'.php') {
        include $_GET['page'];
    }
?>
//www.mysite.com/index.php?page=fish will display /pages/fish.php with session access

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM