460 likes | 733 Views
第 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的預定變數- 說明.
E N D
第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的預定變數-說明 • PHP的預定變數屬於PHP引擎建立的變數,在舊版PHP預定變數的格式為:$HTTP_*_VARS,表示變數屬於瀏覽程式請求網頁時,HTTP通訊協定傳回伺服器的相關資料,因為HTTP通訊協定傳送的不只URL網址,在HTTP標頭資訊擁有瀏覽程式版本、伺服器、Cookie、表單欄位資料等相關資訊。 • 在PHP 4.10之後版本提供一組結合陣列的預定變數,可以取得PHP程式和HTTP標頭的相關資訊,預設擁有全域的變數範圍,稱為「自動全域」(Autoglobals)或「超全域」(Superglobals)變數。
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>"; }
10-2 HTTP標頭處理 • 10-2-1 轉址到其他網頁或PHP程式 • 10-2-2 定時更新網頁 • 10-2-3 設定輸出文件內容的資料類型 • 10-2-4 設定在快取保留的期限
10-2 HTTP標頭處理 • PHP的header()函數可以送出HTML文件的標頭資訊,透過送出的標頭資訊來轉址或定時更新網頁、指定文件內容和保留期限。header()函數的說明,如下表所示:
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-2-2 定時更新網頁 • PHP的header()函數可以使用Refresh型態指定間隔時間來定時更新網頁,如下: header("Refresh: 2"); • 上述Refresh型態的「:」符號後是間隔時間,以此例是2秒。 • 如果在一定時間後轉址到其他URL網址或PHP檔案路徑,只需加上url參數,如下所示: header("Refresh:2;url=Ch10-1-2.php");
10-2-3 設定輸出文件內容的資料類型-說明 • 在header()函數可以使用Content-type型態指定HTTP通訊協定傳送資料到瀏覽程式的資料種類,其值是MIME資料類型,常用類型如下表所示:
10-2-3 設定輸出文件內容的資料類型-使用 • 如果需要輸出成其他文件類型,可以使用header()函數指定MIME資料類型,其程式碼如下所示: header("Content-type: text/xml"); • 上述程式碼指定Content-type型態為text/xml,表示傳送的內容是一份XML文件。
10-2-4 設定在快取保留的期限-說明 • 雖然網站的PHP程式、HTML網頁和圖片等多媒體資料是儲存在Web伺服器,不過為了加速網頁存取,在伺服端、客戶端電腦或Proxy伺服器都會將網頁內容保留在快取空間(Cache)的資料夾或磁碟,以便加速網頁的瀏覽。
10-2-4 設定在快取保留的期限-客戶端快取的說明 • 在客戶端電腦啟動瀏覽程式瀏覽網頁時,網頁內容同時會保留在客戶端電腦的資料夾,此資料夾是一個快取空間,可以加速網頁瀏覽。 • 當使用者重複瀏覽相同的網頁時,瀏覽程式先到快取找找看是否檔案已經存在,如果有,就直接從快取取出網頁內容,而不是每次都連結網站下載網頁內容,如此可節省下載檔案時間,提高瀏覽效率。 • 不過,為了保密、安全原因或希望每次都連結網站下載網頁內容,我們並不希望將網頁內容保留在客戶端快取,或是只允許保留一段時間,所以,我們需要設定PHP程式的保留期限。
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");
10-3 輸出緩衝區處理 • 10-3-1 為什麼使用輸出緩衝區 • 10-3-2 輸出緩衝區處理
10-3-1 為什麼使用輸出緩衝區-說明 • PHP的「輸出緩衝區」(Output Buffer)是用來儲存PHP程式的輸出結果,其目的是等到執行完PHP程式後,才一次送到瀏覽程式顯示。 • 在PHP程式使用輸出緩衝區主要是針對使用header()或第10-4節的setcookie()函數會更改HTTP標頭的情況,避免產生重複寫入標頭資料的錯誤。
10-3-1 為什麼使用輸出緩衝區-圖例 • 例如:更改程式範例Ch10-2-1.php,刪除第1列的<? ob_start(); ?>設定不使用輸出緩衝區輸出網頁內容,就可以測試轉址PHP程式碼時產生的錯誤,如下圖所示:
10-3-2 輸出緩衝區處理-PHP的輸出緩衝區處理(說明) • 在PHP程式開啟輸出緩衝區可以在php.ini檔案指定output_buffering屬性為On或是使用PHP的函數來開啟,我們通常是使用PHP函數來開啟。 • PHP引擎在執行PHP程式碼時,可以選擇將處理的結果馬上輸出到客戶端的瀏覽程式顯示,或是先輸出到暫放的輸出緩衝區,等到PHP程式執行完或是緩衝區已滿,才送到瀏覽程式顯示。
10-3-2 輸出緩衝區處理-PHP的輸出緩衝區處理(圖例)
10-3-2 輸出緩衝區處理-PHP的輸出緩衝區處理(圖例說明) • PHP程式是使用ob_start()函數開啟輸出緩衝區。PHP程式在送到PHP引擎執行後,可以直接將輸出內容送到瀏覽程式顯示,或是將輸出結果先輸出到緩衝區,當遇到下列情況才會將輸出的內容送到瀏覽程式,如下所示: • 執行完PHP程式後。 • 執行到ob_end_flush()、ob_flush()函數馬上將緩衝區的內容送出。
10-3-2 輸出緩衝區處理-PHP輸出緩衝區處理函數 • PHP提供輸出緩衝區控制函數可以開啟、使用和關閉使用輸出緩衝區,其相關函數的說明,如下表所示:
10-4 Cookies的處理 • 10-4-1 Cookies的基礎 • 10-4-2 新增Cookie • 10-4-3 取得Cookie的內容 • 10-4-4 刪除Cookie • 10-4-5 陣列Cookie的使用
10-4-1 Cookies的基礎-說明 • 在Web網站通常都需要保留一些使用者的瀏覽記錄,例如:使用者是否曾經瀏覽過網站,或是一些個人輸入的資訊或選擇。Cookies就是儲存這些資料的主要解決方案之一。 • Cookies的英文是小餅乾的意義,源於這些儲存在客戶端電腦的檔案尺寸都很小,Cookies並不是儲存在伺服器,而是儲存在瀏覽程式所在電腦,所以並不會浪費伺服器資源。
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
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需要在保密情況下,才能在客戶端和伺服端傳送。
10-4-1 Cookies的基礎-Cookie的基本應用 • 個人資訊:使用Cookies保留個人資訊,例如:姓名、地址、時區、帳號和是否曾經進過此網站的記錄。 • 個人化的內容:Cookies可以儲存個人化網站外觀和個人偏好的網站內容,或是提供使用者有興趣的資訊。 • 網站購物車:線上購物車需要保留使用者選擇的商品,Cookies就可以用來記錄選購的商品清單。
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時間刻記。
10-4-2 新增Cookie-範例 • 在PHP程式建立Cookie主要使用setcookie()函數的前3個參數,其程式碼如下所示: setcookie("Username", $name, $date); • 程式碼參數字串Username為Cookie名稱,變數$name是值,$date是時間刻記的整數值,這是Cookie檔案儲存在客戶端電腦的有效期限,其日期計算的運算式,如下所示: $date = strtotime("+10 days", time());
10-4-3 取得Cookie的內容 • 客戶端電腦如果擁有Cookie,PHP程式可以使用$_COOKIE預定變數的結合陣列取得Cookie值,其程式碼如下所示: $user = $_COOKIE["Username"]; $pass = $_COOKIE["Password"]; • 上述程式碼取得Cookie名稱Username和Password的值,然後將它指定給變數$user和$pass。
10-4-4 刪除Cookie • 如果客戶端的Cookie不再需要,PHP程式可以使用setcookie()函數刪除Cookie,刪除Cookie是將expire參數設為過期,其程式碼如下所示: setcookie("Username", "", time()-3600); • 上述程式碼將有限期限設定為1個小時前,因為Cookie已經過期,換句話說,就是刪除客戶端名為Username的Cookie。
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,分別儲存使用者名稱、帳號和密碼。
10-4-5 陣列Cookie的使用-取出 • 因為Cookie是一個陣列,在取得陣列Cookie的值時,可以使用while迴圈配合list()和each()函數取得每一個鍵值的內容,如下所示: if (isset($cookie)) { while (list($name, $value) = each($cookie)) echo "$name = $value<br>"; }
10-5 PHP的交談期追蹤 • 10-5-1 PHP的Session基礎 • 10-5-2 交談期追蹤
10-5-1 PHP的Session基礎-說明 • 若PHP程式啟動Session處理功能(交談期處理功能)。當使用者進入網站,PHP引擎就會自動指定Session ID編號建立一個新Session(交談期),Session(交談期)是指使用者第一次進入網站,直到使用者離開網站為止的整個過程。 • Session類似儲存在客戶端的Cookie,它可以在伺服端保留一些資源來儲存Session變數,PHP程式可以註冊不定數量的Session變數,PHP事實上是使用檔案來儲存這些Session變數。
10-5-1 PHP的Session基礎-圖例 • 當這些變數註冊成為Session變數後,所有啟動Session處理功能的PHP程式都可以存取這些變數。如果同時有多位使用者進入網站,因為每位使用者都會指定不同的Session ID編號,換句話說,每個人都可以擁有專屬的Session變數,如下圖所示:
10-5-2 交談期追蹤-說明 • 交談期追蹤(Session Tracking)是一種機制,可以在一段時間內,讓網站維持一系列從同一位使用者提出(通常是指同一個瀏覽程式提出)請求的狀態保留機制,以便追蹤使用者的狀態。 • 交談期追蹤和第9章的狀態管理十分相似,不過第9章的狀態管理是指如何將一頁PHP程式的狀態傳遞到下一頁PHP程式的方法,交談期追蹤強調的是使用者在整個Session交談期和跨過多頁PHP程式HTTP請求的狀態保留。
10-5-2 交談期追蹤-圖例 • PHP引擎實作交談期追蹤的方式是使用Session變數,PHP引擎指定每一位瀏覽網站的使用者一個Session ID編號來作為識別,使用者每一次的HTTP請求都需附上Session ID編號,以便判斷是否是同一位使用者提出的請求,如下圖所示:
10-6 Session的處理 • 10-6-1 註冊與存取Session變數 • 10-6-2 取消註冊Session變數與關閉Session • 10-6-3 使用Session變數傳遞資料
10-6-1 註冊與存取Session變數-函數 • 在PHP程式使用Session處理功能需要呼叫session_start()函數,以便讓PHP引擎將Session變數等相關資訊載入記憶體,其相關函數的說明如下表所示:
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>
10-6-2 取消註冊Session變數與關閉Session • PHP提供Session相關處理函數可以取消註冊Session變數與關閉Session,其相關函數的說明,如下表所示:
10-6-3 使用Session變數傳遞資料-建立Session變數1 • PHP的Session變數可以在網頁之間傳遞資料,換句話說,我們可以使用Session變數取代表單欄位或URL參數來傳遞資料。例如:使用Session變數儲存使用者資訊,使用者hueyan的Session變數,如下所示: $_SESSION["userName"] = "hueyan"; $_SESSION["userPassword"] = "1234";
10-6-3 使用Session變數傳遞資料-建立Session變數2 • 如果另一位使用者jane也執行此PHP程式,伺服器也會替它建立一組Session變數,其程式碼如下: $_SESSION["userName"] = "jane"; $_SESSION["userPassword"] = "5678";
10-6-3 使用Session變數傳遞資料-取得Session變數值 • 只要PHP程式啟動Session交談期,都可以取得上述Session變數值,如下所示: $name = $_SESSION["userName"]; $pass = $_SESSION["userPassword"];