PHP Conference Japan 2024

session_name

(PHP 4, PHP 5, PHP 7, PHP 8)

session_name取得和/或設定目前的 session 名稱

描述

session_name(?string $name = null): string|false

session_name() 傳回目前的 session 名稱。如果給定 namesession_name() 將會更新 session 名稱並傳回舊的 session 名稱。

如果提供新的 session namesession_name() 會修改 HTTP Cookie(並且在啟用 session.use_trans_sid 時輸出內容)。一旦 HTTP Cookie 已傳送,呼叫 session_name() 會引發一個 E_WARNINGsession_name() 必須在 session_start() 之前呼叫,session 才能正常運作。

session 名稱在請求啟動時會重設為儲存在 session.name 中的預設值。因此,您需要在每個請求(以及在呼叫 session_start() 之前)呼叫 session_name()

參數

name

session 名稱參考 session 的名稱,該名稱用於 Cookie 和 URL 中(例如 PHPSESSID)。它應該只包含字母數字字元;它應該簡短且具有描述性(即,對於啟用 Cookie 警告的使用者)。如果指定 name 且不是 null,則目前 session 的名稱會變更為其值。

警告

session 名稱不能僅由數字組成,至少必須存在一個字母。否則,每次都會產生新的 session id。

傳回值

傳回目前 session 的名稱。如果給定 name 且函式更新 session 名稱,則傳回舊的 session 名稱,或在失敗時傳回 false

變更記錄

版本 描述
8.0.0 name 現在可為 nullable。
7.2.0 session_name() 會檢查 session 狀態,先前它只檢查 Cookie 狀態。因此,較舊的 session_name() 允許在 session_start() 之後呼叫 session_name(),這可能會使 PHP 崩潰並可能導致錯誤行為。

範例

範例 #1 session_name() 範例

<?php

/* 將 session 名稱設定為 WebsiteID */

$previous_name = session_name("WebsiteID");

echo
"先前的 session 名稱是 $previous_name<br />";
?>

參見

新增註解

使用者貢獻註解 9 個註解

144
Hongliang Qiang
20 年前
這聽起來可能不言自明:如果您在 php.ini 中將 session.auto_start 設定為 "true",則 session_name() 函式將沒有實質效果。而顯而易見的解釋是,session 已啟動,因此無法在 session_name() 函式執行之前變更(無論它在腳本中的哪個位置),這也是為什麼 session_name 需要像文件中說明的那樣在 session_start() 之前呼叫的相同原因。

我知道這真的不是什麼大問題。但在我弄清楚這件事之前,我經歷了一段相當艱難的時間,希望它對像我這樣的人有所幫助。
62
php at wiz dot cx
16 年前
如果您嘗試將 php session 命名為 "example.com",它會轉換為 "example_com",並且所有事情都會中斷。

請勿在 session 名稱中使用句號。
38
relsqui at chiliahedron dot com
15 年前
記住,孩子們——如果您想使用 session_set_cookie_params()(例如,變更 session 超時),您必須先使用 session_name()。否則它將無法運作,不會產生任何錯誤,而且文件中沒有任何內容(我所見過的,無論如何)會解釋為什麼會這樣。

感謝 bildungsroman.com 的 brandan 在 session_set_cookie_params() 下留下註解解釋這一點,否則我可能仍然會對此感到困惑。
21
Joseph Dalrymple
13 年前
對於那些想知道的人,這個函式很耗費資源!

在一個執行時間一致為 0.0025 秒的腳本中,僅使用 session_name("foo") 就使我的執行時間飆升至 ~0.09 秒。透過簡單地犧牲 session_name("foo"),我將腳本加速了大約 0.09 秒。
10
Victor H
9 年前
正如 Joseph Dalrymple 所說,新增 session_name 確實會稍微減慢執行時間。
但是,我觀察到的是,它減少了請求之間的波動。
我腳本的請求在 0.045 秒和 0.022 秒之間波動。使用 session_name("myapp"),它會變為 0.050 秒和 0.045 秒。這沒什麼大不了的,但這是一個值得注意的重點。

對於那些設定名稱有問題的人,當 session.auto_start 設定為 1 時,您需要在 php.ini 中設定 session.name!
2
mmulej at gmail dot com
3 年前
希望這不會超出 php.net 的記錄範圍。

session_name('name') 必須在 session_start() 之前設定,因為前者會變更 ini 設定,而後者會讀取這些設定。出於相同的原因,session_set_cookie_params($options) 也必須在 session_start() 之前設定。

我發現最好執行以下操作。

function is_session_started()
{
if (php_sapi_name() === 'cli')
return false;

if (version_compare(phpversion(), '5.4.0', '>='))
return session_status() === PHP_SESSION_ACTIVE;

return session_id() !== '';
}
if (!is_session_started()) {
session_name($session_name);
session_set_cookie_params($cookie_options);
session_start();
}
-1
tony at marston-home dot demon dot co dot uk
6 年前
關於 session_name() 取得和/或設定目前 session 名稱的描述,在技術上是錯誤的。它所做的只是處理 php.ini 檔案中 session.name 值所提供的原始值。

因此:-
$name = session_name();
在功能上等同於
$name = ini_get('session.name');
以及
session_name('newname');
在功能上等同於
ini_set('session.name','newname');

這也表示
$old_name = session_name('newname');
在功能上等同於
$old_name = ini_set('session.name','newname');

session.name 的目前值在呼叫 session_start() 之前不會附加到 session。 一旦 session_start() 使用 session.name 在 cookie 資料中查找 session_id(),名稱就變得無關緊要,因為對 session 資料的所有後續操作都是以 session_id() 作為鍵值。

請注意,在 session 目前處於活動狀態時變更 session.name 不會更新任何 session cookie 中的名稱。新名稱要到下次呼叫 session_start() 時才會生效,而這需要關閉使用先前 session.name 值建立的目前 session。
-3
tony at marston-home dot demon dot co dot uk
6 年前
描述最近被修改為包含「當提供新的 session 名稱時,session_name() 會修改 HTTP cookie」的敘述。這是錯誤的,因為 session_name() 從未修改任何 cookie 資料。session.name 的變更要到呼叫 session_start() 時才會生效,而如果 cookie 不存在,則是由 session_start() 建立 cookie。

詳細資訊請參閱以下錯誤報告:https://bugs.php.net/bug.php?id=76413
-2
descartavel1+php at gmail dot com
1 年前
總是嘗試將您 session 名稱屬性的前綴設定為 `__Host-` 或 `__Secure-`,以從瀏覽器改進的安全性中獲益。請參閱 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes

此外,如果您啟用了 auto_session,您必須在您的設定 (php.ini、htaccess 等) 中的 session.name 中設定此名稱。
To Top