mentor-program-day89

維持自己的步調,不要操之過急。

進度

今天一樣看 [MTR01] 複習前幾週的內容,做了一個簡短筆記:資料庫正規化

接著複習完資料庫的部分後,我又回去研究了 session 和 cookie 這小倆口的愛恨情仇。感覺對這兩個概念有在更清楚一些,但還是有些模糊。

像是如果拿 Huli 寫的這篇:白話 Session 與 Cookie:從經營雜貨店開始,我會這樣區分 cookie 和 session:

  • session 是一種讓瀏覽器能夠「記住狀態」的機制,實作的方式有很多種,可以是網址,也可以是 cookie。
  • cookie 只是一個拿來儲存東西的文字檔,之所以和 session 那麼曖昧是因為大部分會拿它來實作 session 機制。

所以這邊能做個總結:session 是一種讓瀏覽器記住狀態的「機制」,而 cookie 只是實現 session 的一種方式。

但是,如果你到網路上搜尋其他 session 和 cookie 的解釋,例如這篇:Day14-Session與Cookie差別,又會得到不同的觀點,我直接節錄一段:

Session 負責紀錄在 server端上的使用者訊息,會在一個用戶完成身分認證後,存下所需的用戶資料,接著產生一組對應的 ID,存入 cookie 後傳回用戶端。 Session泛指有始有終的系列動作/消息,好比會話一般。

簡單來說,大部分人對 session 的定義是:

  1. 資料要儲存在 server 端
  2. client 端只會儲存 session_id

總之,我個人還是傾向 Huli 的觀點。雖然你去外面問別人 session 是什麼?一字排開都會告訴你第二種的觀點,但總覺得還是哪裡怪怪?

哪裡怪?我也不知道,就是怪怪的。

學到的事情

研究 session 其實是想複習 PHP 裡面的 session_start() 背後在做什麼,所以就來複習一下吧:

第一步:打開 session

1
session_start()

執行這一行的時候,可以想成是幫你執行:

1
setcookie('PHPSESSID', 'p0s3rb0qd9ih82tbgv120n882p', 'Session');

接著就會幫你到 tmp 裡建立一個檔案,用來儲存資料:

1
2
3
4
5
6
7
8
9
───tmp
├───ibE87C
├───ibE87D
├───ibE87E
├───ibE88F
├───sess_8oadq07ei2b8g25muckbpfjs8n
├───sess_p0s3rb0qd9ih82tbgv120n882p => 假設是它吧
├───sess_gukpo79ueg96nfld2mj5jo2sql
├───why

第二步:設定 session 資料

接下來是儲存資料:

1
$_SESSION['username'] = 'peanu';

這一步會自動幫你幫資料存到 sess_p0s3rb0qd9ih82tbgv120n882p 裡面:

1
2
# cat sess_p0s3rb0qd9ih82tbgv120n882p
username|s:5:"peanu";

第三步:結束 session

最後是清除資料:

1
session_destroy();

這一步可以想成是「這個 session 結束了,幫我清除所有紀錄」,所以 sess_p0s3rb0qd9ih82tbgv120n882p 會被刪除,而 $_SESSION 也會變成一個空陣列。

主要的流程差不多就是這樣吧。

後來我研究很久的地方是「怎麼把 application 裡的 PHPSESSID 給刪除?」。執行 session_destroy() 雖然能清掉 server 端的資料,但是 client 端的 cookie 還是會保留 PHPSESSID。

我爬了很多文章,也試過了很多種方式,像是直接 set-cookie 讓 cookie 過期,還是改寫值之類的我都是過了,但就是沒有作用。

雖然有點沮喪,但沒關係,就之後再慢慢研究吧。

題外話

複習是件需要耐心的事,但還是繼續加油!

許願池

明天繼續複習,希望能把以前不懂的部分給補齊。

如何 PHP 正確的清除 session 資料庫正規化
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×