[Powered by Google Translate] [PHP的会话] [汤米MacWilliam,哈佛大学] [这是CS50。] [CS50.TV] 在PHP会话可以被用来实现功能 如用户登录,在您的Web应用程序。 PHP会话让你的信息相关联 与用户的整个浏览会话 而不是简单的单页。 因此,这意味着当用户访问不同的PHP页面,使您的网站, 在会话中的任何信息将持续存在。 因此,这意味着,通过一个页面存储在会话中的数据 以后可以通过其他页面被访问。 在一个会话中存储的信息是容易的, 我们通过美元符号这么做,下划线,资本SESSION变量。 美元符号,下划线,SESSION-就像美元符号,下划线,GET 和美元符号,下划线,后期 是一个关联数组组成的键值对。 所以我们可以使用语法类似美元符号,下划线,会议, 支架,报价,富,报价,支架,等于,报价,酒吧,报价, 存储的关键值“栏中的”“富”。 然而,我们才可以写入或从会话阵列读, 我们需要调用一个特殊的函数, 会议强调,启动,() - 这将初始化会话。 因此,让我们来看看一个例子。 我们的第一个页面,hello.php的,使用该会话来输出一些数据给用户。 请记住,我们需要使用在session_start才可以访问任何会话数据。 现在,我们正在使用PHP的使用isset,以确定是否存在密钥 在$ _SESSION关联数组中。 如果该键存在,这意味着用户已登录, 所以我们会显示用户的名称。 如果该键没有被设置,这意味着用户已经尚未登录, 所以我们会显示一个链接到的login.php。 因此,让我们来看看login.php中。 到这里,我们有一个单输入一个HTML表单。 表单的action属性是$ _SERVER ['PHP_SELF'], 而这仅仅意味着我们想要的形式提交到当前文件, 其中,在这种情况下,是login.php中。 因此,让我们回到这个文件的顶部。 如果用户提交了表单,那么$ _POST ['名称']必须设置。 有关HTML表单和岗位的详细信息, 检查出的PHP Web开发视频。 在用户没有提交表单的情况下, 我们想编写自己键入到会话中的价值。 现在,我们可以重定向到的hello.php用户。 因为我们已经存储了用户的输入到会话中, 的hello.php将能够访问被设置在login.php中的值。 因此,让我们看看这个在Web浏览器。 首先,我们将导航到http://localhost/hello.php。 在这里我们可以看到,我们尚未登入, 所以让我们单击登录链接,这将重定向我们的login.php。 好吧,我输入我的名字,然后将存储在会话中。 太棒了!现在,我们可以看到我的输入从login.php中的hello.php的通过了会议。 那么,怎么样注销用户? 好吧,为了将用户登录,我们简单地存储一个值到会话名称。 因此,要注销用户,我们只需要删除该名称密钥 从会话数组。 因此,让我们来看看这最后一个文件,logout.php。 再次,我们需要调用session_start() 之前,我们可以做任何事情会话相关。 现在,我们可以简单地调用session_destroy(), 这将需要摆脱会话中的所有数据的照顾 然后将用户重定向回的hello.php。 所以,如果我点击注销链接, 我们可以看到,该服务器已经忘记了我是谁, 而我不再登录。 所以,这是怎么回事引擎盖底下? 为了得到我们刚才看到的行为, 我们的服务器需要做两件事情。 首先,服务器需要以某种方式在会话中存储的数据。 构成一个网站的不同的PHP文件 作为PHP解释器的单独调用执行 所以局部变量不能在它们之间共享。 相反,服务器需要存储我们的数据会话 在一些地方,多。php文件可以访问。 其次,服务器需要会话数据,只有我的浏览会话相关联。 当我登录到Facebook, 有可能是数以百万计的其他人也登录到Facebook的在同一时间。 但服务器需要我的关联数据的一些方法 我目前的工作阶段,并与另一个会话别人的数据。 幸运的是,PHP的作者想过这一切对我们来说, 所以我们不需要实现任何的这个自己。 但是,让我们来看看什么是PHP的默认操作。 当我访问包含在session_start第一次一个PHP页面, PHP将产生大量的随机值。 直到session_destroy被称为或我不访问该网站上的所有PHP网页了一会儿, 该随机,可能唯一的值会跟我联系。 这样,该服务器具有识别我的浏览会话的一些方法 而不是别人的。 我们可以看看在当前的会话ID 使用PHP函数,SESSION_ID。 在这里,我们只是简单地输出我们的会话标识符的值。 因此,如果我们再登录到该示例Web应用程序, 现在导航到sessid.php, 我们将看到此字符长的字符串, 这就是目前的标识符我的会议, 这就是服务器如何跟踪我是谁。 好吧,但我们只解决了问题的一半。 当然,服务器现在已经确定我的一些方法, 但是当我访问另一个页面时,服务器需要重复使用相同的标识符 而不是生成一个新的。 请记住,如果我在foo.php声明一个局部变量 然后参观bar.php, bar.php没有办法知道发生了什么事在foo.php的。 所以默认的PHP会话实现,浏览器必须提醒服务器 其中会话ID使用。 这是在cookie的形式来实现。 一个cookie,除了是美味小吃 只是你的计算机上的小文本文件 一个服务器可以通过Web浏览器写入。 所以在PHP通过在session_start产生我唯一的会话ID, 它会告诉Web浏览器来存储标识符在本地文本文件,或一个cookie。 然后,Web浏览器将包含该标识符在每个请求 它使服务器。 所以,真正的web服务器不记得我是谁。 取而代之的是,web浏览器被简单地记住的唯一标识符 这是由PHP生成,然后不断提醒服务器 那是什么标识符。 这样一来,信息,比如我的用户名存储在服务器不是我的Web浏览器上。 浏览器只是告诉PHP在哪里存储这些信息的服务器 所以PHP可以检索它。 所以这引出了一个问题,在这里是PHP的实际存储这些信息? 默认情况下,PHP将保存您的会话数据 在/ tmp目录,或“临时”文件夹内的文件。 该文件的名称包括会话ID,以便PHP可以判断 该文件的读取和从仅通过会话ID写​​。 好的。因此,让我们在Chrome的调试器打开网络选项卡 通过右上角的扳手图标。 现在,让我们头再次的hello.php。 让我们点击HTTP请求的hello.php 然后点击标头。 在这里,我们可以看到,该cookie头中包含一个名为PHPSESSID键, 或PHP的会话ID-使用一个值,我们看到了同样长的字符串 当我们参观sessid.php。 这究竟是如何在浏览器提醒哪些会话ID应该被使用的服务器。 它包括它在HTTP头中。 好的。让我们头回终端。 让我们浏览到/ tmp,其中PHP默认情况下,存储会话信息。 果然,这个临时文件夹里面, 这里包含完全相同的会话ID的文件。 如果我们打开这个文件,我们可以看到PHP是代表我在磁盘上的会话。 这里字符串“汤米”被存储为键'的名字,' 这正是我们所期待的。 这就是在PHP会话的概述。 我们刚才看到的是会话的唯一的默认实现。 事实上,很多网站更改此默认行为 为更有效地存储PHP会话 在提高性能的利益。 我的名字是汤米,这是CS50。 [CS50.TV]