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