为什么我们在网页中的任何其他内容之前调用session_start()


Why do we call session_start() before any other content in the web page?

我想知道为什么我们在网页中的任何其他内容之前调用session_start((?

让我试着描述一下HTTP协议是如何工作的。

来自浏览器的请求如下:

GET /somefolder/somescript.php HTTP/1.1
Host: www.yourhost.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Your_Useragent
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp;q=0.8
Referer: http://testreferer.com/
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,bg;q=0.2
Another-Header: Value1
Another-Header1: Value2

来自服务器的请求看起来几乎是这样的:

HTTP/1.1 200 OK
Cache-Control: max-age=21600
Strict-Transport-Security: max-age=15552000; includeSubdomains; preload
Content-Security-Policy: upgrade-insecure-requests
Some-Other-Header: Value1
And-Another-Header: Value2'n'n
<YOUR WEBPAGE CONTENTS>

所以,第一个服务器最终发送标题和'n'n,然后开始发送您的网页内容。但是session_start()正在发送"它自己的"标头,但当它们已经发送完毕时,您不能发送任何标头!

示例:

<?php
Header("SomeCoolHeader: Value1"); //Sending custom headers
session_start(); //Sending session header
Header("AnotherHeader: Value2"); //Sending custom headers
echo "Some text"; //Header sending automatically finished and sent some html text
?>

示例2(有错误(:

<?php
Header("CustomHeader1: Value1"); //sending custom headers
echo "Some text"; //Header sending automatically finished and sent some html text
Header("CustomHeader2: Value2"); //Cannot add header information - headers already sent
?>

示例3(有错误(:

<?php
Header("CustomHeader1: Value1"); //sending custom headers
echo "Some text"; //Header sending automatically finished and sent some html text
session_start(); //Cannot add header information - headers already sent
?>

如果你还有任何问题,你可以在评论中问我。

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

当session_start((被调用或会话自动启动时,PHP将调用打开和读取会话保存处理程序。它们要么是默认提供的内置保存处理程序,要么是PHP扩展(如SQLite或Memcached(提供的;或者可以是session_set_save_handler((定义的自定义处理程序。读取回调将检索任何现有的会话数据(以特殊的序列化格式存储(,并且将不进行序列化,并在读取回调将保存的会话数据返回给PHP会话处理时用于自动填充$_session超全局。

要使用命名会话,请先调用session_name((,然后再调用session_start((。

启用session.use_trans_sid后,session_start((函数将注册一个内部输出处理程序,用于URL重写。

如果用户使用ob_gzhandler或类似的ob_start((,那么函数顺序对于正确的输出非常重要。例如,在启动会话之前,必须注册ob_gzhandler。

正如我们所知,cookie存储在浏览器中,会话存储在服务器中。会话中没有大小限制。为了解决这个问题,我们必须看看PHP是如何在内部工作的。在php.ini文件中,您可以在session、下看到如下内容

[Session]
session.save_handler = files
session.save_path = "/tmp"
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0

在默认配置中,php将会话存储为服务器中的一个文件,默认路径为"/tem"。在tmp中,您可以看到名为"sess_4b1e384ad74619bd212e236e52a5a174If"的文件,这只是一个会话文件。在正常情况下,有许多用户同时访问同一个网站。然后tmp文件夹中有许多这样的文件。当php在tmp文件夹中创建一个文件时,php在客户端浏览器中设置一个cookie作为名称和值PHPSESSID。此cookie显示在下图中。在此处输入图像描述

对于每个请求,浏览器都会将此cookie发送到服务器。在此处输入图像描述