Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我应该在何时何地使用session_start?_Php_Session - Fatal编程技术网

Php 我应该在何时何地使用session_start?

Php 我应该在何时何地使用session_start?,php,session,Php,Session,我应该在何时何地使用PHP中的session_start 例如,假设我有一个登录脚本,它设置了一个会话变量来告诉用户是否登录。然后,我必须将session_start放在脚本的顶部,或者如果登录成功,就必须在实际设置session变量之前 <?php // session_start(); here? if (login($username, $password)) { // session_start(); or here? $_SESSION["username"]

我应该在何时何地使用PHP中的session_start

例如,假设我有一个登录脚本,它设置了一个会话变量来告诉用户是否登录。然后,我必须将session_start放在脚本的顶部,或者如果登录成功,就必须在实际设置session变量之前

<?php
// session_start(); here?

if (login($username, $password)) {
    // session_start(); or here?

    $_SESSION["username"] = $username;
}
?>
另一个例子是这样的,根据W3学校的说法

注意:会话启动功能必须是文档中的第一件事。在任何HTML标记之前


在页面顶部开始会话通常是最好的。但是,如果您不需要整个文档/代码的会话,您可以始终将其放在if子句之后,如本例所示。

在页面顶部启动会话通常是最好的。但是,如果整个文档/代码不需要会话,您可以像本例中一样将其放在if子句之后。

除非您启用了输出缓冲,否则会话启动必须在头中设置cookie时,发送到浏览器的头以外的任何内容之前

它必须在您尝试引用$\u会话数据之前出现

在您的示例中,在任何一个实例之前都没有输出html标记,因此这两个实例都可以工作


打开会话会有一些成本,因此,如果您正在对请求进行额外的、非基于会话的验证,那么将会话启动推迟到这些检查通过后,确实会增加您对DOS攻击的抵抗力。

除非您启用了输出缓冲,会话启动必须在头以外的任何内容发送到浏览器之前,因为它在头中设置了cookie

它必须在您尝试引用$\u会话数据之前出现

在您的示例中,在任何一个实例之前都没有输出html标记,因此这两个实例都可以工作


打开会话会有一些成本,因此,如果您正在对请求进行额外的、非基于会话的验证,那么将会话启动推迟到这些检查通过后,确实会增加您对DOS攻击的抵抗力。

会话启动功能可以在代码中的任何地方使用。为了保持一致性,您应该将其放在文档的开头,然后结束。如果在所有登录/数据库驱动页面上都包含单独的数据库或配置文件,则应将其放在其中,这样就不必在每个页面中重新编码

会话启动功能可以在代码中的任何地方运行。为了保持一致性,您应该将其放在文档的开头,然后结束。如果在所有登录/数据库驱动页面上都包含单独的数据库或配置文件,则应将其放在其中,这样就不必在每个页面中重新编码

正如其他人所说,你必须做的绝对要求是:

在读取或写入$会话之前,必须运行会话\u start,否则它将只是一个普通数组,不会保存在任何位置。 在单个脚本执行页面加载期间,您不得运行两次session_start,除非您在其间使用session_write_close将其关闭。 有一条额外规则在技术上有例外,但最好将其视为绝对规则:

在编写任何输出echo、PHP块之外的HTML等之后,不要启动会话,因为如果服务器已经开始发送内容,PHP可能无法向浏览器发送cookie。 您可能希望避免启动会话的原因有两个:

当您打开会话时,PHP会锁定会话,以避免两个进程将冲突数据写入会话,因此,如果您有多个请求同时发生,您希望避免它们彼此等待,除非它们确实需要。例如,如果您正在响应AJAX请求,并且不需要来自会话的任何数据,请不要打开它。 正如symcbean所提到的,创建新会话需要一些成本,因此,如果您的站点正忙于处理合法或恶意流量,您可能希望在根本不启动的情况下提供一些登录页或错误消息。
在这之后,它就变成了风格和架构的问题,但是如果你确定页面需要它,那么涵盖上述大部分内容的经验法则是尽快的。

正如其他人所说,你必须做的绝对要求是:

在读取或写入$会话之前,必须运行会话\u start,否则它将只是一个普通数组,不会保存在任何位置。 在单个脚本执行页面加载期间,您不得运行两次session_start,除非您在其间使用session_write_close将其关闭。 有一条额外规则在技术上有例外,但最好将其视为绝对规则:

在编写任何输出echo、PHP块之外的HTML等之后,不要启动会话,因为如果服务器已经开始发送内容,PHP可能无法向浏览器发送cookie。 有两个原因可以避免启动s 休会:

当您打开会话时,PHP会锁定会话,以避免两个进程将冲突数据写入会话,因此,如果您有多个请求同时发生,您希望避免它们彼此等待,除非它们确实需要。例如,如果您正在响应AJAX请求,并且不需要来自会话的任何数据,请不要打开它。 正如symcbean所提到的,创建新会话需要一些成本,因此,如果您的站点正忙于处理合法或恶意流量,您可能希望在根本不启动的情况下提供一些登录页或错误消息。
在这之后,这就变成了风格和架构的问题,但涵盖上述大部分内容的经验法则是,如果您确定页面需要它,则应尽快完成。

至于您的问题,您可以在任何地方启动会话,但请注意,会话必须在任何输出之前启动。因此,在页面顶部启动会话被认为是一种合理的方法。在使用任何会话变量之前,您应该启动会话。您也只能调用session\u start一次。多次调用会产生错误。@u\u mulder我添加了一个额外的thought@superW3学校因提供错误信息而臭名昭著。没有理由认为它必须是文档中的第一件事。唯一重要的是,它出现在任何页面内容发送之前,无论是HTML还是其他内容。至于您的问题,您可以在任何地方启动会话,但请注意,会话必须在任何输出之前启动。因此,在页面顶部启动会话被认为是一种合理的方法。在使用任何会话变量之前,您应该启动会话。您也只能调用session\u start一次。多次调用会产生错误。@u\u mulder我添加了一个额外的thought@superW3学校因提供错误信息而臭名昭著。没有理由认为它必须是文档中的第一件事。唯一重要的是,它出现在任何页面内容发送之前,无论是HTML还是其他内容