現在程式設計師愈發的不容易了,想要精通,必然要尋本溯源,這其實與目前氾濫的愈發高級的語言以及眾多的框架剛好相反,因為它們在盡可能的掩蓋本源使其簡單,個人稱之為程式設計師學習悖論。
註:作者接觸web開發和php兩週左右,以下內容適合初學者。
從文題目看,
從文題目看,
思路中首先使用PHsession是什麼,
2、會話(Session)說明
a. Session的由來 幾乎每個人都上網,數以億計的數據在網路中相互傳輸,數據之所以能夠安全的傳輸,是基於HTTP協議的,很是億計的數據在網路中相互傳輸,數據之所以能夠安全的傳輸,是基於HTTP協議的,很是億計。其實HTTP協定所幹的事情就是提供完成你的網路訪問一系列方法,雙方建構了一次訪問,原則上就是一個會話建立了。說一個例子:小明在瀏覽器中輸入https://www.baidu.com/(HTTPS是HTTP的加密版本,相比是增加了SSL加密層),這是小明對百度發起了一個請求,說: “我要看你的介面”,百度的伺服器收到訊息,訊息中包括了小名想乾的事情,同時包括了小明的地址(否則百度不知道把內容給誰了),伺服器核對訊息OK ,對小明這個請求
進行備案,發送出小名想要的東西,一次完整的請求結束了。 這就是一次
會話,會話的核心在於小明的資訊備案(其實還涉及到TCP/IP的連線問題,這個與本文無關,忽略)其實與其說是建構了一個Session,不如說將一次訪問概括為一個Session。 b. Session能幹什麼用從上面內容可以得到,每一個訪問都是一個會話,服務器都要備案信息,這是有開銷的,同時呢,也不大可能同一個人連續訪問十次二十次就建置保存十次二十次,一個是增加開銷,另一個是也比較蠢了。也就是說,一個人(確切地說是同一個電腦和瀏覽器),
在某個特定時間內,能夠復用一個Session的,為什麼在特定時間內呢?因為Session是有預設的過期時間,
過期後伺服器就清理掉了(如果不這樣,你想想世界那麼多人,來一個保留一個,太虧)。
ok,既然同一個人,多次訪問都是一個Session(不要懷疑服務器無法判別是同一個人,具體可以看上面推介的書),而且每次訪問的內容都是做備案的,那麼也是說,你Session週期內所有的行為伺服器都是知道的,
那麼接下來重要的作用就來了,伺服器透過對你的存取請求分析,能夠獲知到這個特定使用者的行為偏好的,透過做一定的分析,能夠推送一些用戶喜歡關心的數據,廣告定向也就是這麼來的。
3、PHP中Session的使用透過上面的囉嗦,可以發現,Session這個概念其實是在伺服器端發生的。
PHP提供了一系列的配置、函數等,很好的實作Session功能🎜。 Session支援在PHP 中是在並發訪問時由一個方法來保存某些數據.從而使你能夠構建更多的定製程序從而提高你的web 網站的吸引力. 一個訪問者訪問你的web 網站將被分配一個唯一的id, 就是所謂的session id. 這個id 可以儲存在用戶端的一個cookie 中,也可以透過URL 進行傳遞.會話支援允許你將請求中的資料保存在超全域數組🎜$_SESSION🎜中.一個訪客造訪你的網站,PHP 將自動檢查(如果session.auto_start 被設定為1)或在你要求下檢查(明確透過session_start()或隱式透過session_register()) 當前session id 是否是先前發送的請求創建. 如果是這種情況, 那麼先前保存的環境將被重建. 🎜透過為每個獨立使用者分配唯一的Session ID,可實現針對不同使用者分別儲存資料的功能。 會話通常被用來在多個頁面請求之間保存及共享資訊。 一般來說,Session ID 透過 cookie 的方式傳送到瀏覽器,伺服器端也是透過會話 ID 來取回會話中的資料。 如果請求中不包含會話 ID 訊息,那麼 PHP 就會建立一個新的Session,並為新建立的Session指派新的 ID。
Session的工作流程很簡單。當開始一個Session時,PHP 會嘗試從請求中尋找Session ID (通常透過Session cookie), 如果請求中不包含Session ID 訊息,PHP 就會建立新的Session。 Session開始之後,PHP 就會將Session中的資料設定到 $_SESSION變數中。 當 PHP 停止的時候,它會自動讀取$_SESSION中的內容,並將其進行序列化, 然後發送給會話保存管理器器來進行保存。預設情況下,PHP 使用內建的檔案Session保存管理器(files
)來完成Session的儲存。 也可以透過設定項session.save_handler(php.ini中設定項目)來修改所要採用的Session保存管理器。 對於檔案Session保存管理器,Session會話資料儲存到設定項session.save_path (php.ini中配置項目)所指定的位置。可以透過呼叫函數session_start來手動開始一個會話。 如果設定項session.auto_start 設定為1
, 那麼請求開始的時候,Session會自動開始。 PHP 腳本執行完畢之後,session會自動關閉。 同時,也可以透過呼叫函數session_wirte_close() 來手動關閉會話。
這部分內容放在這裡說是因為,不說明前面問題,鬼知道php.ini中的配置是什麼東西。 上面提到的session.save_handler和session.save_path,這兩個就是php.ini裡的設定項目,這塊不細說,因為php手冊實在是太詳細了。本文預設模式是files。
session_start()是session機制的開始,session會判斷目前是否有$_COOKIE[session_name()];session_name()傳回儲存session_id的COOKIE鍵值,如果不存在會產生一個session_id,然後把產生的session_id作為COOKIE的值傳遞到客戶端.相當於執行了下面COOKIE 操作。相反,如果存在session_id =$_COOKIE[session_name];然後去session.save_path指定的資料夾裡去找名字為'SESS_'.session_id()的檔案.讀取檔案的內容反序列化,然後放到$_SESSION中。
在會話結束的時候,會執行Session寫入作業或是手動執行session_write_close()操作。
程式碼裡面銷毀Session一般有三種方法,
1. setcookie(session_name 1. setcookie(session_name),session_id(),time() -8005 2. usset($_SESSION); //這會刪除所有的$_SESSION數據,刷新後,有COOKIE傳過來,但沒有數據。
3. session_destroy(); //刪除$_SESSION 刪除session檔案以及session_id
//SESSION初始化的时候调用 function open($save_path, $session_name) { global $sess_save_path; $sess_save_path=$save_path; return(true); } //关闭的时候调用 function close() { return(true); } function read($id) { global $sess_save_path; $sess_file="$sess_save_path/sess_$id"; return (string) @file_get_contents($sess_file); } //脚本执行结束之前,执行写入操作 function write($id,$sess_data) { global$sess_save_path; $sess_file="$sess_save_path/sess_$id"; if ($fp= @fopen($sess_file,"w")) { $return=fwrite($fp,$sess_data); fclose($fp); return$return; } else { return(false); } } function destroy($id) { global $sess_save_path; $sess_file="$sess_save_path/sess_$id"; return(@unlink($sess_file)); } function gc($maxlifetime) { global$sess_save_path; foreach (glob("$sess_save_path/sess_*") as$filename) { if (filemtime($filename) +$maxlifetime<time()) { @unlink($filename); } } return true; }