bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure]]]]] )
setcookie() 定義一個和其余的 HTTP 標(biāo)頭一起發(fā)送的 cookie。和其它標(biāo)頭一樣,cookie
必須在腳本的任何其它輸出之前發(fā)送(這是協(xié)議限制)。這需要將本函數(shù)的調(diào)用放到任何輸出之前,包括 <html> 和
<head> 標(biāo)簽以及任何空格。如果在調(diào)用 setcookie() 之前有任何輸出,本函數(shù)將失敗并返回 FALSE。如果
setcookie() 函數(shù)成功運行,將返回 TRUE。這并不說明用戶是否接受了 cookie。
注: 自 PHP 4
起,可以用輸出緩存來在調(diào)用本函數(shù)前輸出內(nèi)容,代價是把所有向瀏覽器的輸出都緩存在服務(wù)器,直到下命令發(fā)送它們。可以在代碼中使用
ob_start() 及 ob_end_flush() 來實現(xiàn)這樣的功能,或者通過修改 php.ini 中的 output_buffering
配置選項來實現(xiàn),也可以通過修改服務(wù)器配置文件來實現(xiàn)。
除了 name 外,其它所有參數(shù)都是可選的。可以用空字符串("")替換某參數(shù)以跳過該參數(shù)。因為參數(shù) expire
是整型,不能用空字符串掉過,可以用零(0)來代替 。下面的說明對 setcookie() 的每一個參數(shù)都進(jìn)行了解釋。可以對照 Netscape
cookie 規(guī)范以了解 setcookie() 的每一個參數(shù)的細(xì)節(jié)以及通過閱讀 RFC 2965 了解 HTTP cookie 的工作方式。
1. setcookie() 參數(shù)詳解
參數(shù) 說明 舉例
name Cookie 的名字: 使用 $_COOKIE['cookiename'] 調(diào)用名為 cookiename 的 cookie。
value Cookie 的值:此值保存在客戶端,不要用來保存敏感數(shù)據(jù)。 假定 name 是 'cookiename',可以通過 $_COOKIE['cookiename'] 取得其值。
expire Cookie 過期的時間:這是個 Unix 時間戳,即從 Unix 紀(jì)元開始的秒數(shù)。換而言之,通常用
time() 函數(shù)再加上秒數(shù)來設(shè)定 cookie 的失效期。或者用 mktime()來實現(xiàn)。 time()+60*60*24*30 將設(shè)定
cookie 30 天后失效。如果未設(shè)定,cookie 將會在會話結(jié)束后(一般是瀏覽器關(guān)閉)失效。
path Cookie 在服務(wù)器端的有效路徑: 如果該參數(shù)設(shè)為 '/' 的話,cookie 就在整個 domain 內(nèi)有效,如果設(shè)為 '/foo/',cookie 就只在 domain 下的 /foo/ 目錄及其子目錄內(nèi)有效,例如 /foo/bar/。默認(rèn)值為設(shè)定 cookie 的當(dāng)前目錄。
domain 該 cookie 有效的域名: 要使 cookie 能在如 example.com 域名下的所有子域都有效的話,該參數(shù)應(yīng)該設(shè)為 '.example.com'。雖然 . 并不必須的,但加上它會兼容更多的瀏覽器。如果該參數(shù)設(shè)為 www.example.com 的話,就只在 www 子域內(nèi)有效。細(xì)節(jié)見 Cookie 規(guī)范中的 tail matching。
secure 指明: cookie 是否僅通過安全的 HTTPS 連接傳送。當(dāng)設(shè)成 TRUE 時,cookie 僅在安全的連接中被設(shè)置。默認(rèn)值為 FALSE。 0 或 1
當(dāng) cookie 被設(shè)置后,便可以在其它頁面通過 $_COOKIE 或 $HTTP_COOKIE_VARS
數(shù)組取得其值。需要注意的是,autoglobals 的 $_COOKIE 形式適用于 PHP 4.1.0 或更高版本。而
$HTTP_COOKIE_VARS 則從 PHP 3 起就可以使用。Cookie 的值也會被保存到 $_REQUEST 數(shù)組中。
注: 如果 PHP 的選項 register_globals 被設(shè)為 on 的話,cookie 的值仍然會被斌到變量內(nèi)。在下面的例子中,$TestCookie 會被注冊,但是仍然推薦使用 $_COOKIE 數(shù)組。
常見缺陷:
* Cookies 不會在設(shè)置它的本頁生效,要測試一個 cookie
是否被成功的設(shè)定,可以在其到期之前通過另外一個頁面來訪問其值。過期時間是通過參數(shù) expire 來設(shè)置的??梢院唵蔚厥褂?
print_r($_COOKIE); 來調(diào)試現(xiàn)有的 cookies。
* Cookie 必須用和設(shè)定時的同樣的參數(shù)才能刪除。如果其值一個空字符串,或者是 FALSE,并且其它的參數(shù)都和前一次調(diào)用 setcookie 時相同,那么所指定名稱的 cookie 將會在遠(yuǎn)程客戶端被刪除。
* 由于把 cookie 的值設(shè)為 FALSE 會使客戶端嘗試刪除這個 cookie,所以要在 cookie 上保存
TRUE 或 FALSE 時不應(yīng)該直接使用 boolean 值,而應(yīng)該用 0 來表示 FALSE,用 1 來表示 TRUE
* 可以把 cookie 的名稱設(shè)置成一個數(shù)組,但是數(shù)組 cookie
中的每個元素的值將會被單獨保存在用戶的系統(tǒng)中??紤]使用 explode() 函數(shù)用多個名稱和值設(shè)定一個 cookie。不推薦將
serialize() 用于此目的,因為它可能會導(dǎo)致一個安全漏洞。
在 PHP 3 中,在同一個 PHP 腳本中多次使用 setcookie() 來設(shè)置
cookie,將會按照倒序的方式來分別執(zhí)行,如果想要在插入另外一個 cookie 之前刪除一個 cookie,要把插入放到刪除之前。自 PHP
4 起,多次調(diào)用 setcookie() 則是按照順序來執(zhí)行的。
下面一些例子說明了如何發(fā)送 cookie:
例子 1. setcookie() 發(fā)送例子
$value = 'something from somewhere';
setcookie("TestCookie", $value);
setcookie("TestCookie", $value,time()+3600); /* expire in 1 hour */
setcookie("TestCookie", $value,time()+3600, "/~rasmus/", ".utoronto.ca", 1);
注意 cookie 中值的部分在發(fā)送的時候會被自動用 urlencode 編碼并在接收到的時候被自動解碼并把值賦給與自己同名的
cookie 變量。如果不想這樣并且在使用 PHP 5 的話,可以用 setrawcookie()
來代替。下面這個簡單的例子可以得到剛才所設(shè)定的 cookie 的值:
<?php
// 輸出單獨的 cookie
echo $_COOKIE["TestCookie"];
echo $HTTP_COOKIE_VARS["TestCookie"];
// 另一個調(diào)試的方法就是輸出所有的 cookie
print_r($_COOKIE);
?>
要刪除 cookie 需要確保它的失效期是在過去,才能觸發(fā)瀏覽器的刪除機制。下面的例子說明了如何刪除剛才設(shè)置的 cookie:
例子 2. setcookie() 刪除例子
// 將過期時間設(shè)為一小時前
setcookie("TestCookie", "", time() - 3600);
setcookie("TestCookie", "", time() - 3600, "/~rasmus/", ".utoronto.ca", 1);
也可以通過在 cookie 名稱中使用數(shù)組符號來設(shè)定數(shù)組 cookie,可以設(shè)定多個 cookie 作為數(shù)組單元,在腳本提取 cookie 時所有的值都放在一個數(shù)組中:
例子 3. setcookie() 中使用數(shù)組的例子
<?php
// 設(shè)定 cookie
setcookie("cookie[three]", "cookiethree");
setcookie("cookie[two]", "cookietwo");
setcookie("cookie[one]", "cookieone");
// 刷新頁面后,顯示出來
if (isset($_COOKIE['cookie'])) {
foreach ($_COOKIE['cookie'] as $name => $value) {
echo "$name : $value <br />\n";
}
}
?>
上例將輸出:
three : cookiethree
two : cookietwo
one : cookieone
注: 下面的一些 RFC 也具參考價值:RFC 2109 和 RFC 2695。
注意 expire 參數(shù)的接受的是 Unix 時間戳,而不是日期格式 Wdy, DD-Mon-YYYY HH:MM:SS GMT,這是因為 PHP 在內(nèi)部進(jìn)行了轉(zhuǎn)換。
expire 是與客戶端的時間相比較,和服務(wù)器時間可能不同。
注: 向 Microsoft Internet Explorer 4 Service Pack 1 不能正確處理設(shè)定了 path 的 cookie。
Netscape Communicator 4.05 及 Microsoft Internet Explorer 3.x 不能正確處理沒有設(shè)定 path 和 time 的 cookie。
參見 header(),setrawcookie()