主域名 `hzhuti.com` 下有多個二級域名(`www.hzhuti.com`、`bbs.hzhuti.com`、`blog.hzhuti.com`),需實現 Cookie 在所有子域名間共享讀寫。
| 設定值 | 效果 | 備註 |
|---|---|---|
| `*.hzhuti.com` | ❌ 失效 | 通配符 `*` 不被標準支援 |
| `.hzhuti.com` | ✅ 成功 | 標準寫法,前綴點表示包含所有子域名 |
| `hzhuti.com` | ✅ 成功 | 現代瀏覽器同樣視為包含子域名(RFC 6265) |
| `ss.hzhuti.com` | ⚠️ 僅限該子域名 | 不共享給其他子域名 |
// 共享給所有子域名,路徑為根目錄,有效期 12 小時
setcookie("hzhuti", $value, time() + 3600*12, '/', '.hzhuti.com');
path: '/' 確保全站路徑可讀。domain: '.hzhuti.com' 明確宣告共享範圍,相容性最佳。<?php
/**
* PHP Cookie 操作類
* 支援多值儲存(內部序列化)、自動處理 magic_quotes、過期時間設定
*/
class PHP_COOKIE {
private $_name = '';
private $_val = [];
private $_expires;
private $_path = '/';
private $_domain = '';
public function __construct($cname, $cexpires = '', $cpath = '/', $cdomain = '') {
$this->_name = $cname;
$this->_expires = $cexpires ? $cexpires : time() + 60*60*24*30*12; // 預設 1 年
$this->_path = $cpath;
$this->_domain = $cdomain;
$this->_val = [];
$this->extract();
}
private function extract($cname = '') {
if (!isset($_COOKIE)) {
global $_COOKIE;
$_COOKIE = $GLOBALS["HTTP_COOKIE_VARS"] ?? [];
}
$cname = $cname ?: $this->_name;
if (!empty($_COOKIE[$cname])) {
$val = $_COOKIE[$cname];
if (get_magic_quotes_gpc()) $val = stripslashes($val);
$arr = @unserialize($val);
if ($arr !== false && is_array($arr)) {
foreach ($arr as $k => $v) {
$_COOKIE[$k] = $v;
$GLOBALS[$k] = $v;
}
$this->_val = $arr;
}
}
unset($_COOKIE[$cname], $GLOBALS[$cname]);
}
public function put($var, $value) {
$_COOKIE[$var] = $value;
$this->_val[$var] = $value;
$GLOBALS[$var] = $value;
if (empty($value)) unset($this->_val[$var]);
}
public function get($var) {
return $this->_val[$var] ?? null;
}
public function clear() {
$this->_val = [];
}
public function set() {
$cookie_val = empty($this->_val) ? '' : serialize($this->_val);
if (strlen($cookie_val) > 4096) {
trigger_error("Cookie {$this->_name} exceeds 4KB limit", E_USER_WARNING);
}
setcookie($this->_name, $cookie_val, $this->_expires, $this->_path, $this->_domain);
}
}
$cookie = new PHP_COOKIE('user_data', time()+3600, '/', '.hzhuti.com');
$cookie->put('uid', 12345);
$cookie->put('name', 'John Doe');
$cookie->set(); // 寫入瀏覽器
// 讀取
$cookie2 = new PHP_COOKIE('user_data');
echo $cookie2->get('uid'); // 12345