[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]