1 / 45

第 10 章 交談期追蹤的Session與Cookies處理

第 10 章 交談期追蹤的Session與Cookies處理. 10-1 PHP 的預定變數 10-2 HTTP 標頭處理 10-3 輸出緩衝區處理 10-4 Cookies 的處理 10-5 PHP 的交談期追蹤 10-6 Session 的處理. 10-1 PHP的預定變數. 10-1-1 PHP 的預定變數 10-1-2 伺服器系統資訊的內容. 10-1-1 PHP的預定變數- 說明.

janine
Download Presentation

第 10 章 交談期追蹤的Session與Cookies處理

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第10章 交談期追蹤的Session與Cookies處理 • 10-1 PHP的預定變數 • 10-2 HTTP標頭處理 • 10-3 輸出緩衝區處理 • 10-4 Cookies的處理 • 10-5 PHP的交談期追蹤 • 10-6 Session的處理

  2. 10-1 PHP的預定變數 • 10-1-1 PHP的預定變數 • 10-1-2 伺服器系統資訊的內容

  3. 10-1-1 PHP的預定變數-說明 • PHP的預定變數屬於PHP引擎建立的變數,在舊版PHP預定變數的格式為:$HTTP_*_VARS,表示變數屬於瀏覽程式請求網頁時,HTTP通訊協定傳回伺服器的相關資料,因為HTTP通訊協定傳送的不只URL網址,在HTTP標頭資訊擁有瀏覽程式版本、伺服器、Cookie、表單欄位資料等相關資訊。 • 在PHP 4.10之後版本提供一組結合陣列的預定變數,可以取得PHP程式和HTTP標頭的相關資訊,預設擁有全域的變數範圍,稱為「自動全域」(Autoglobals)或「超全域」(Superglobals)變數。

  4. 10-1-1 PHP的預定變數-超全域變數

  5. 10-1-2 伺服器系統資訊的內容-變數名稱

  6. 10-1-2 伺服器系統資訊的內容-使用 • 在PHP程式可以指定變數名稱的鍵值來取得指定的系統資訊,如下所示: $ip = $_SERVER["REMOTE_ADDR"]; $path = $_SERVER["SCRIPT_NAME"]; • 程式碼的鍵值是變數名稱,以此例可以取得使用者的IP位址和目前執行PHP程式的路徑。 • PHP程式可以使用foreach迴圈顯示伺服器的所有變數值,如下所示: foreach ($_SERVER as $key=>$value) { echo "<tr><td>" . $key . "</td>"; echo "<td>" . $value . "</td></tr>"; }

  7. 10-2 HTTP標頭處理 • 10-2-1 轉址到其他網頁或PHP程式 • 10-2-2 定時更新網頁 • 10-2-3 設定輸出文件內容的資料類型 • 10-2-4 設定在快取保留的期限

  8. 10-2 HTTP標頭處理 • PHP的header()函數可以送出HTML文件的標頭資訊,透過送出的標頭資訊來轉址或定時更新網頁、指定文件內容和保留期限。header()函數的說明,如下表所示:

  9. 10-2-1 轉址到其他網頁或PHP程式 • 轉址功能是指在執行PHP程式時,可以轉址到其他網址或網站的其他網頁或PHP程式,header()函數是使用Location型態來指定轉址的URL網址,如下所示: header("Location: Ch10-1-2.php"); header("Location: http://localhost/Ch09/Ch9-3-1.htm“); header("Location: http://www.hinet.net");

  10. 10-2-2 定時更新網頁 • PHP的header()函數可以使用Refresh型態指定間隔時間來定時更新網頁,如下: header("Refresh: 2"); • 上述Refresh型態的「:」符號後是間隔時間,以此例是2秒。 • 如果在一定時間後轉址到其他URL網址或PHP檔案路徑,只需加上url參數,如下所示: header("Refresh:2;url=Ch10-1-2.php");

  11. 10-2-3 設定輸出文件內容的資料類型-說明 • 在header()函數可以使用Content-type型態指定HTTP通訊協定傳送資料到瀏覽程式的資料種類,其值是MIME資料類型,常用類型如下表所示:

  12. 10-2-3 設定輸出文件內容的資料類型-使用 • 如果需要輸出成其他文件類型,可以使用header()函數指定MIME資料類型,其程式碼如下所示: header("Content-type: text/xml"); • 上述程式碼指定Content-type型態為text/xml,表示傳送的內容是一份XML文件。

  13. 10-2-4 設定在快取保留的期限-說明 • 雖然網站的PHP程式、HTML網頁和圖片等多媒體資料是儲存在Web伺服器,不過為了加速網頁存取,在伺服端、客戶端電腦或Proxy伺服器都會將網頁內容保留在快取空間(Cache)的資料夾或磁碟,以便加速網頁的瀏覽。

  14. 10-2-4 設定在快取保留的期限-客戶端快取的說明 • 在客戶端電腦啟動瀏覽程式瀏覽網頁時,網頁內容同時會保留在客戶端電腦的資料夾,此資料夾是一個快取空間,可以加速網頁瀏覽。 • 當使用者重複瀏覽相同的網頁時,瀏覽程式先到快取找找看是否檔案已經存在,如果有,就直接從快取取出網頁內容,而不是每次都連結網站下載網頁內容,如此可節省下載檔案時間,提高瀏覽效率。 • 不過,為了保密、安全原因或希望每次都連結網站下載網頁內容,我們並不希望將網頁內容保留在客戶端快取,或是只允許保留一段時間,所以,我們需要設定PHP程式的保留期限。

  15. 10-2-4 設定在快取保留的期限-指定PHP程式的保留期限 • PHP程式可以使用header()函數指定Expires型態設定網頁檔案在快取保留的時間,時間是GMT格林威治時間,如下所示: header("Expires: ". gmdate("D, d M Y H:i:s", mktime(0,0,0,12,31,2006))." GMT" ); • 程式碼使用gmdate()函數取得GMT時間,mktime()函數指定日期/時間,以此例是:Sat, 30 Dec 2006 16:00:00 GMT。 • 如果不想將PHP程式保留在快取,只需將Expires設為過去時間即可,如下所示: header("Expires: Mon, 26 Jul 2004 05:00:00 GMT");

  16. 10-3 輸出緩衝區處理 • 10-3-1 為什麼使用輸出緩衝區 • 10-3-2 輸出緩衝區處理

  17. 10-3-1 為什麼使用輸出緩衝區-說明 • PHP的「輸出緩衝區」(Output Buffer)是用來儲存PHP程式的輸出結果,其目的是等到執行完PHP程式後,才一次送到瀏覽程式顯示。 • 在PHP程式使用輸出緩衝區主要是針對使用header()或第10-4節的setcookie()函數會更改HTTP標頭的情況,避免產生重複寫入標頭資料的錯誤。

  18. 10-3-1 為什麼使用輸出緩衝區-圖例 • 例如:更改程式範例Ch10-2-1.php,刪除第1列的<? ob_start(); ?>設定不使用輸出緩衝區輸出網頁內容,就可以測試轉址PHP程式碼時產生的錯誤,如下圖所示:

  19. 10-3-2 輸出緩衝區處理-PHP的輸出緩衝區處理(說明) • 在PHP程式開啟輸出緩衝區可以在php.ini檔案指定output_buffering屬性為On或是使用PHP的函數來開啟,我們通常是使用PHP函數來開啟。 • PHP引擎在執行PHP程式碼時,可以選擇將處理的結果馬上輸出到客戶端的瀏覽程式顯示,或是先輸出到暫放的輸出緩衝區,等到PHP程式執行完或是緩衝區已滿,才送到瀏覽程式顯示。

  20. 10-3-2 輸出緩衝區處理-PHP的輸出緩衝區處理(圖例)

  21. 10-3-2 輸出緩衝區處理-PHP的輸出緩衝區處理(圖例說明) • PHP程式是使用ob_start()函數開啟輸出緩衝區。PHP程式在送到PHP引擎執行後,可以直接將輸出內容送到瀏覽程式顯示,或是將輸出結果先輸出到緩衝區,當遇到下列情況才會將輸出的內容送到瀏覽程式,如下所示: • 執行完PHP程式後。 • 執行到ob_end_flush()、ob_flush()函數馬上將緩衝區的內容送出。

  22. 10-3-2 輸出緩衝區處理-PHP輸出緩衝區處理函數 • PHP提供輸出緩衝區控制函數可以開啟、使用和關閉使用輸出緩衝區,其相關函數的說明,如下表所示:

  23. 10-4 Cookies的處理 • 10-4-1 Cookies的基礎 • 10-4-2 新增Cookie • 10-4-3 取得Cookie的內容 • 10-4-4 刪除Cookie • 10-4-5 陣列Cookie的使用

  24. 10-4-1 Cookies的基礎-說明 • 在Web網站通常都需要保留一些使用者的瀏覽記錄,例如:使用者是否曾經瀏覽過網站,或是一些個人輸入的資訊或選擇。Cookies就是儲存這些資料的主要解決方案之一。 • Cookies的英文是小餅乾的意義,源於這些儲存在客戶端電腦的檔案尺寸都很小,Cookies並不是儲存在伺服器,而是儲存在瀏覽程式所在電腦,所以並不會浪費伺服器資源。

  25. 10-4-1 Cookies的基礎-HTTP標頭的Cookie資料(格式) • 在伺服器回應客戶端請求的HTTP回應資料內就含有HTTP標頭資訊,HTTP標頭提供回應網頁檔案的重要資訊,內含多種欄位資料,每個欄位的格式,如下所示: field-name:field_value • field-name為欄位名稱,field_value為欄位值,當客戶端向伺服器提出請求時,在HTTP回應資料的標頭就會將設定Cookie資料的欄位送到客戶端,其格式如下所示: Set-Cookie:name=value;expires=date;path=pname;domain=dname;secure

  26. 10-4-1 Cookies的基礎-HTTP標頭的Cookie資料(屬性說明) • name屬性:Cookie的名稱,可以使用此名稱取出Cookie值和刪除Cookie。 • expires屬性:一個選項,可有可無,指定Cookie存在的有效期限,使用GMT的時間,其格式如下所示: Weekday, DD-MM-YY HH:MM:SS GMT • domain屬性:伺服器的網域名稱,預設是建立Cookie的伺服器網域名稱。 • path屬性:在domain屬性下的路徑名稱,path屬性可以進一步在同一個網站分辨是哪一個網頁所建立的Cookies。 • secure屬性:如果指定此屬性,表示Cookie需要在保密情況下,才能在客戶端和伺服端傳送。

  27. 10-4-1 Cookies的基礎-Cookie的基本應用 • 個人資訊:使用Cookies保留個人資訊,例如:姓名、地址、時區、帳號和是否曾經進過此網站的記錄。 • 個人化的內容:Cookies可以儲存個人化網站外觀和個人偏好的網站內容,或是提供使用者有興趣的資訊。 • 網站購物車:線上購物車需要保留使用者選擇的商品,Cookies就可以用來記錄選購的商品清單。

  28. 10-4-2 新增Cookie-語法 • PHP的Cookie是使用setcookie()函數建立,其語法格式如下所示: setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]]) • 函數的參數是對應HTTP標頭Cookie資料的屬性,value是Cookie值,expire是Cookie保留的客戶端的期限,其值是整數的UNIX時間刻記。

  29. 10-4-2 新增Cookie-範例 • 在PHP程式建立Cookie主要使用setcookie()函數的前3個參數,其程式碼如下所示: setcookie("Username", $name, $date); • 程式碼參數字串Username為Cookie名稱,變數$name是值,$date是時間刻記的整數值,這是Cookie檔案儲存在客戶端電腦的有效期限,其日期計算的運算式,如下所示: $date = strtotime("+10 days", time());

  30. 10-4-3 取得Cookie的內容 • 客戶端電腦如果擁有Cookie,PHP程式可以使用$_COOKIE預定變數的結合陣列取得Cookie值,其程式碼如下所示: $user = $_COOKIE["Username"]; $pass = $_COOKIE["Password"]; • 上述程式碼取得Cookie名稱Username和Password的值,然後將它指定給變數$user和$pass。

  31. 10-4-4 刪除Cookie • 如果客戶端的Cookie不再需要,PHP程式可以使用setcookie()函數刪除Cookie,刪除Cookie是將expire參數設為過期,其程式碼如下所示: setcookie("Username", "", time()-3600); • 上述程式碼將有限期限設定為1個小時前,因為Cookie已經過期,換句話說,就是刪除客戶端名為Username的Cookie。

  32. 10-4-5 陣列Cookie的使用-建立 • Cookie儲存的資料也可以是結合陣列,在PHP程式取得Cookie後,同一個Cookie名稱下還可以使用鍵值儲存多個值,如下所示: setcookie("user[Name]", "陳會安", time()+3600); setcookie("user[Username]", "Joe", time()+3600); setcookie("user[Password]", "1234", time()+3600); • 程式碼新增名為user的Cookie,這個Cookie是結合陣列,擁有3個元素,其鍵值依序為:Name、Username和Password,分別儲存使用者名稱、帳號和密碼。

  33. 10-4-5 陣列Cookie的使用-取出 • 因為Cookie是一個陣列,在取得陣列Cookie的值時,可以使用while迴圈配合list()和each()函數取得每一個鍵值的內容,如下所示: if (isset($cookie)) { while (list($name, $value) = each($cookie)) echo "$name = $value<br>"; }

  34. 10-5 PHP的交談期追蹤 • 10-5-1 PHP的Session基礎 • 10-5-2 交談期追蹤

  35. 10-5-1 PHP的Session基礎-說明 • 若PHP程式啟動Session處理功能(交談期處理功能)。當使用者進入網站,PHP引擎就會自動指定Session ID編號建立一個新Session(交談期),Session(交談期)是指使用者第一次進入網站,直到使用者離開網站為止的整個過程。 • Session類似儲存在客戶端的Cookie,它可以在伺服端保留一些資源來儲存Session變數,PHP程式可以註冊不定數量的Session變數,PHP事實上是使用檔案來儲存這些Session變數。

  36. 10-5-1 PHP的Session基礎-圖例 • 當這些變數註冊成為Session變數後,所有啟動Session處理功能的PHP程式都可以存取這些變數。如果同時有多位使用者進入網站,因為每位使用者都會指定不同的Session ID編號,換句話說,每個人都可以擁有專屬的Session變數,如下圖所示:

  37. 10-5-2 交談期追蹤-說明 • 交談期追蹤(Session Tracking)是一種機制,可以在一段時間內,讓網站維持一系列從同一位使用者提出(通常是指同一個瀏覽程式提出)請求的狀態保留機制,以便追蹤使用者的狀態。 • 交談期追蹤和第9章的狀態管理十分相似,不過第9章的狀態管理是指如何將一頁PHP程式的狀態傳遞到下一頁PHP程式的方法,交談期追蹤強調的是使用者在整個Session交談期和跨過多頁PHP程式HTTP請求的狀態保留。

  38. 10-5-2 交談期追蹤-圖例 • PHP引擎實作交談期追蹤的方式是使用Session變數,PHP引擎指定每一位瀏覽網站的使用者一個Session ID編號來作為識別,使用者每一次的HTTP請求都需附上Session ID編號,以便判斷是否是同一位使用者提出的請求,如下圖所示:

  39. 10-6 Session的處理 • 10-6-1 註冊與存取Session變數 • 10-6-2 取消註冊Session變數與關閉Session • 10-6-3 使用Session變數傳遞資料

  40. 10-6-1 註冊與存取Session變數-函數 • 在PHP程式使用Session處理功能需要呼叫session_start()函數,以便讓PHP引擎將Session變數等相關資訊載入記憶體,其相關函數的說明如下表所示:

  41. 10-6-1 註冊與存取Session變數-使用 • 在PHP程式使用Session變數需要先註冊,如下所示: session_register("page_counter"); • 在註冊成為Session變數後,PHP程式就可以使用$_SESSION結合陣列的預定變數來取得指定的Session變數,如下所示: $_SESSION["page_counter"]++; • 程式碼將Session變數page_counter加一。可以使用session_id()函數取得使用者的Session ID,如下所示: 使用者的Session ID : <? echo session_id() ?><br>

  42. 10-6-2 取消註冊Session變數與關閉Session • PHP提供Session相關處理函數可以取消註冊Session變數與關閉Session,其相關函數的說明,如下表所示:

  43. 10-6-3 使用Session變數傳遞資料-建立Session變數1 • PHP的Session變數可以在網頁之間傳遞資料,換句話說,我們可以使用Session變數取代表單欄位或URL參數來傳遞資料。例如:使用Session變數儲存使用者資訊,使用者hueyan的Session變數,如下所示: $_SESSION["userName"] = "hueyan"; $_SESSION["userPassword"] = "1234";

  44. 10-6-3 使用Session變數傳遞資料-建立Session變數2 • 如果另一位使用者jane也執行此PHP程式,伺服器也會替它建立一組Session變數,其程式碼如下: $_SESSION["userName"] = "jane"; $_SESSION["userPassword"] = "5678";

  45. 10-6-3 使用Session變數傳遞資料-取得Session變數值 • 只要PHP程式啟動Session交談期,都可以取得上述Session變數值,如下所示: $name = $_SESSION["userName"]; $pass = $_SESSION["userPassword"];

More Related