首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Yii 2.0 Cookie 與 Session 深度操作指南

     編輯:PHP 綜合知識

核心概念:Request/Response 分離

Yii 2 將 Cookie 讀寫分離到不同組件:

  • 寫入/刪除:Yii::$app->response->cookies(Response 物件)
  • 讀取:Yii::$app->request->cookies(Request 物件)

Session 則統一通過 Yii::$app->session 操作。

一、Cookie 完整操作

1. 新增 Cookie(兩種寫法)

// 寫法 A:物件導向
$cookie = new \yii\web\Cookie([
    'name'     => 'smister',
    'value'    => 'cookieValue',
    'expire'   => time() + 3600,
    'httpOnly' => true, // 防 XSS
]);
Yii::$app->response->cookies->add($cookie);

// 寫法 B:鏈式調用(Yii 2.0.10+)
Yii::$app->response->cookies->add(new \yii\web\Cookie([
    'name' => 'token', 'value' => 'abc123', 'expire' => time() + 86400,
]));

2. 讀取 Cookie

$cookies = Yii::$app->request->cookies;

// 獲取值(推薦)
$value = $cookies->getValue('smister'); // 不存在返回 null
$value = $cookies->get('smister');      // 返回 Cookie 物件

// 存在性檢查
if ($cookies->has('smister')) { /* ... */ }

// 計數
$count = $cookies->count(); // 或 $cookies->getCount()

3. 刪除 Cookie

// 刪除單個
$cookie = Yii::$app->request->cookies->get('smister');
Yii::$app->response->cookies->remove($cookie);

// 刪除全部(慎用)
Yii::$app->response->cookies->removeAll();

⚠️ 常見誤區

錯誤:Yii::$app->request->cookies->remove('name')
正確:必須操作 response->cookies,因為刪除本質是發送一個過期的 Set-Cookie 響應頭。

二、Session 操作

Session 自動啟動(首次讀寫時),無需手動 session_start()。

$session = Yii::$app->session;

// 寫入
$session->set('user_name', 'myname');
$session->set('user_data', [1, 2, 3]); // 支援陣列/物件自動序列化

// 讀取
$name = $session->get('user_name');
$data = $session->get('user_data');

// 刪除
$session->remove('user_name');
$session->removeAll(); // 清空當前 Session

// 閒置超時配置(config/main.php)
'components' => [
    'session' => [
        'timeout' => 1800, // 30 分鐘
    ],
],

三、進階配置與最佳實踐

Cookie 安全強化

// config/main.php
'components' => [
    'request' => [
        'cookieValidationKey' => 'your-secret-key', // 必須設置,用於簽名驗證
        'csrfParam' => '_csrf',
    ],
    'response' => [
        'format' => \yii\web\Response::FORMAT_JSON,
    ],
],

Session 存儲驅動切換

// Redis 存儲(高併發推薦)
'components' => [
    'session' => [
        'class' => 'yii\redis\Session',
        'redis' => 'redis', // 需配置 redis 組件
    ],
],

// 資料庫存儲
'session' => [
    'class' => 'yii\web\DbSession',
    'sessionTable' => '{{%session}}',
],

四、除錯技巧

  • 開發環境關閉 httpOnly 方便 JS 除錯
  • 使用 Yii::debug($cookies->toArray()) 列印所有 Cookie
  • Session ID 傳遞方式:useTransSid、useCookies、useOnlyCookies 三項配置控制

結語

掌握 Yii 2 的 Request/Response 分離模型 是正確操作 Cookie 的關鍵。Session 則提供了統一、可插拔的存儲抽象。建議在項目初期統一規劃 Cookie 域、路徑、安全標誌,並根據業務量級選擇 Session 存儲引擎,避免後期遷移成本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved