## cookie簡介
Cookie是存儲在客戶端瀏覽器中的數據,我們通過Cookie來跟蹤與存儲用戶數據。一般情況下,Cookie通過HTTP headers從服務端返回到客戶端。多數web程序都支持Cookie的操作,因為Cookie是存在于HTTP的標頭之中,所以必須在其他信息輸出以前進行設置,類似于header函數的使用限制。
PHP通過setcookie函數進行Cookie的設置,任何從瀏覽器發回的Cookie,PHP都會自動的將他存儲在$_COOKIE的全局變量之中,因此我們可以通過$_COOKIE['key']的形式來讀取某個Cookie值。
PHP中的Cookie具有非常廣泛的使用,經常用來存儲用戶的登錄信息,購物車等,且在使用會話Session時通常使用Cookie來存儲會話id來識別用戶,Cookie具備有效期,當有效期結束之后,Cookie會自動的從客戶端刪除。同時為了進行安全控制,Cookie還可以設置域跟路徑,我們會在稍后的章節中詳細的講解他們。
## 設置cookie
PHP設置Cookie最常用的方法就是使用setcookie函數,setcookie具有7個可選參數,我們常用到的為前5個:
name( Cookie名)可以通過$_COOKIE['name'] 進行訪問
value(Cookie的值)
expire(過期時間)Unix時間戳格式,默認為0,表示瀏覽器關閉即失效
path(有效路徑)如果路徑設置為'/',則整個網站都有效
domain(有效域)默認整個域名都有效,如果設置了'www.imooc.com',則只在www子域中有效
~~~
$value = 'test';
setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600); //有效期一小時
setcookie("TestCookie", $value, time()+3600, "/path/", "imooc.com");
~~~ //設置路徑與域
PHP中還有一個設置Cookie的函數setrawcookie,setrawcookie跟setcookie基本一樣,唯一的不同就是value值不會自動的進行urlencode,因此在需要的時候要手動的進行urlencode。
`setrawcookie('cookie_name', rawurlencode($value), time()+60*60*24*365); `
因為Cookie是通過HTTP標頭進行設置的,所以也可以直接使用header方法進行設置。
`header("Set-Cookie:cookie_name=value");`
## cookie的刪除與過期時間
通過前面的章節,我們了解了設置cookie的函數,但是我們卻發現php中沒有刪除Cookie的函數,在PHP中刪除cookie也是采用setcookie函數來實現。
`setcookie('test', '', time()-1); `
可以看到將cookie的過期時間設置到當前時間之前,則該cookie會自動失效,也就達到了刪除cookie的目的。之所以這么設計是因為cookie是通過HTTP的標頭來傳遞的,客戶端根據服務端返回的Set-Cookie段來進行cookie的設置,如果刪除cookie需要使用新的Del-Cookie來實現,則HTTP頭就會變得復雜,實際上僅通過Set-Cookie就可以簡單明了的實現Cookie的設置、更新與刪除。
了解原理以后,我們也可以直接通過header來刪除cookie。
`header("Set-Cookie:test=1393832059; expires=".gmdate('D, d M Y H:i:s \G\M\T', time()-1));`
這里用到了gmdate,用來生成格林威治標準時間,以便排除時差的影響。
## cookie的有效路徑
cookie中的路徑用來控制設置的cookie在哪個路徑下有效,默認為'/',在所有路徑下都有,當設定了其他路徑之后,則只在設定的路徑以及子路徑下有效,例如:
`setcookie('test', time(), 0, '/path');`
上面的設置會使test在/path以及子路徑/path/abc下都有效,但是在根目錄下就讀取不到test的cookie值。
一般情況下,大多是使用所有路徑的,只有在極少數有特殊需求的時候,會設置路徑,這種情況下只在指定的路徑中才會傳遞cookie值,可以節省數據的傳輸,增強安全性以及提高性能。
當我們設置了有效路徑的時候,不在當前路徑的時候則看不到當前cookie。
~~~
setcookie('test', '1',0, '/path');
var_dump($_COOKIE['test']);
~~~
## session與cookie的異同
cookie將數據存儲在客戶端,建立起用戶與服務器之間的聯系,通常可以解決很多問題,但是cookie仍然具有一些局限:
cookie相對不是太安全,容易被盜用導致cookie欺騙
單個cookie的值最大只能存儲4k
每次請求都要進行網絡傳輸,占用帶寬
session是將用戶的會話數據存儲在服務端,沒有大小限制,通過一個session_id進行用戶識別,PHP默認情況下session id是通過cookie來保存的,因此從某種程度上來說,seesion依賴于cookie。但這不是絕對的,session id也可以通過參數來實現,只要能將session id傳遞到服務端進行識別的機制都可以使用session。
## 使用session
在PHP中使用session非常簡單,先執行session_start方法開啟session,然后通過全局變量$_SESSION進行session的讀寫。
~~~
session_start();
$_SESSION['test'] = time();
var_dump($_SESSION);
~~~
session會自動的對要設置的值進行encode與decode,因此session可以支持任意數據類型,包括數據與對象等。
~~~
session_start();
$_SESSION['ary'] = array('name' => 'jobs');
$_SESSION['obj'] = new stdClass();
var_dump($_SESSION);
~~~
默認情況下,session是以文件形式存儲在服務器上的,因此當一個頁面開啟了session之后,會獨占這個session文件,這樣會導致當前用戶的其他并發訪問無法執行而等待。可以采用緩存或者數據庫的形式存儲來解決這個問題,這個我們會在一些高級的課程中講到。
## 刪除與銷毀session
刪除某個session值可以使用PHP的unset函數,刪除后就會從全局變量$_SESSION中去除,無法訪問。
~~~
session_start();
$_SESSION['name'] = 'jobs';
unset($_SESSION['name']);
echo $_SESSION['name']; //提示name不存在
~~~
如果要刪除所有的session,可以使用session_destroy函數銷毀當前session,session_destroy會刪除所有數據,但是session_id仍然存在。
~~~
session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
session_destroy();
~~~
值得注意的是,session_destroy并不會立即的銷毀全局變量$_SESSION中的值,只有當下次再訪問的時候,$_SESSION才為空,因此如果需要立即銷毀$_SESSION,可以使用unset函數。
~~~
session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
unset($_SESSION);
session_destroy();
var_dump($_SESSION); //此時已為空
~~~
如果需要同時銷毀cookie中的session_id,通常在用戶退出的時候可能會用到,則還需要顯式的調用setcookie方法刪除session_id的cookie值。
## 使用session來存儲用戶的登錄信息
session可以用來存儲多種類型的數據,因此具有很多的用途,常用來存儲用戶的登錄信息,購物車數據,或者一些臨時使用的暫存數據等。
用戶在登錄成功以后,通常可以將用戶的信息存儲在session中,一般的會單獨的將一些重要的字段單獨存儲,然后所有的用戶信息獨立存儲。
~~~
$_SESSION['uid'] = $userinfo['uid'];
$_SESSION['userinfo'] = $userinfo;
~~~
一般來說,登錄信息既可以存儲在sessioin中,也可以存儲在cookie中,他們之間的差別在于session可以方便的存取多種數據類型,而cookie只支持字符串類型,同時對于一些安全性比較高的數據,cookie需要進行格式化與加密存儲,而session存儲在服務端則安全性較高。
- 前端工程師
- HTML
- 使用meta實現頁面的定時刷新或跳轉
- 表單相關
- 表單元素input、按鈕、文字完美垂直居中對齊方法
- CSS
- 相關工具網站
- JS
- jQuery
- 第1章 初始jQuery
- 環境搭建
- jQuery對象與DOM對象
- jQuery對象轉化成DOM對象
- DOM對象轉化成jQuery對象
- 第2章 jQuery選擇器
- id選擇器
- 類選擇器
- 元素選擇器
- 全選擇器(*選擇器)
- 層級選擇器
- 基本篩選選擇器
- 內容篩選選擇器
- 可見性篩選選擇器
- 屬性篩選選擇器
- 子元素篩選選擇器
- 表單元素選擇器
- 表單對象屬性篩選選擇器
- 特殊選擇器this
- 第3章 jQuery的屬性與樣式
- 元素的數據存儲
- 問題解決方案
- 解決innerHTML包含的js代碼不能被執行的問題
- webpackdoc
- 前端開發框架
- Bootstrap 3.3.6
- 起步
- 全局 CSS 樣式
- 概覽
- 柵格系統
- PHP
- PHP入門篇
- 基礎總結
- PHP環境變量$_SERVER和系統常量詳細說明
- PHP進階篇
- 數組
- 函數
- 類
- 字符串操作
- 正則表達式
- 會話控制
- 文件系統
- 日期和時間
- 圖形圖像操作
- PHP異常處理
- 數據庫操作
- WEB在線文件管理器
- PHP文件操作
- 獲取首層目錄信息
- 獲取文件信息
- 列表顯示文件及大小
- PHP與MySQL關系大揭秘
- PHP支持哪些數據庫
- 數據庫擴展
- 連接MySQL數據庫
- 執行MySQL查詢
- 插入新數據到MySQL中
- MVC架構模式分析與設計
- Smarty模版語法
- Smarty的基本語法
- Smarty的條件判斷語句
- Smarty的循環語句
- Smarty的文件引用
- Smarty類和對象賦值與使用
- Smarty函數的使用
- functions函數插件的定義和使用
- modifiers變量調節器插件的定義和使用
- block functions區塊函數插件的定義和使用
- Smarty實例
- MVC微型框架的建立
- 網絡摘抄
- PHPExcel如何讀取超大excel文件
- Composer
- Composer技巧
- PHP 開發者該知道的 5 個 Composer 小技巧
- composer常用命令
- Composer使用方法整理(Cy23)
- 利用Composer一步一步搭建自己的PHP框架
- ThinkPHP
- ThinkPHP中RBAC類詳解(一)
- 附:添加注釋版RBAC類源碼
- 常見問題
- 常見方法
- thinkphp 合并兩個字段組合成一個臨時字段concat函數
- ThinkPHP Where 條件中使用表達式
- 編程相關工具
- Eclipse
- Eclipse或Zendstudio漢化
- Zend studio
- Zendstudio快捷鍵
- Zend Studio實用快捷鍵一覽表
- Sublime text
- Sublime text快捷鍵
- 16 個 Sublime Text 快捷鍵
- Emmet的用法及相關語法
- VS Code
- 數據庫
- MySql
- 問題匯總
- mysql創建存儲過程失敗1307錯誤解決
- Mysql出現Field * doesn't have a default value解決辦法
- mysql:ADO連接mysql數據庫,驅動程序和ODBC數據源問題
- 自己如何正確獲取MYSQL的ADO連接字符串
- 網上摘抄
- mysql 存在更新 不存在插入
- Mysql字符串字段中是否包含某個字符串,用 find_in_set
- mysql字段類型對應的數字編號
- 5.7mysql group分組查詢錯誤問題
- mysql常用操作語句
- SQL2005
- SQL常見錯誤
- 使用 sp_change_users_login 修復產生的孤 立賬戶 & 還原中的孤立用戶
- ASP
- Url編碼解碼函數合集 含utf-8和gb2312
- 其他前端相關技巧
- 聯機查看 Office 文檔
- 服務器配置
- windows
- 服務器安裝
- XAMPP自帶TOMCAT插件可以支持php+java
- IIS
- iis7服務器,客戶端無法下載exe文件的解決之道
- Linux
- ubuntu
- Linux安裝JDK
- 輔助開發工具
- Git