轉錄自 http://km.tceb.edu.tw/~wsx/php/ch7-2.htm
|
|
session 函式
|
|
當PHP在使用Session的功能之前,由於 php.ini 的一些設定值會影響session函數的使用,所以應先了解
有關session在php.ini 的有關設定:
參數名稱
|
預設值
|
說明
|
參數可變更性
|
session.save_path |
/tmp
|
session檔案存放路徑 |
可任意修改 |
session.name |
PHPSESSID
|
session 的名稱(類似cookie的變數名稱) |
可任意修改 |
session.save_handler |
files
|
處理session存取的模式(預設:檔案) |
可任意修改 |
session.auto_start |
0
|
自動啟動(預設:關) |
可任意修改 |
session.gc_probability |
1
|
「垃圾收集」(garbage collection,資源回收筒)的處理機率
|
可任意修改 |
session.gc_maxlifetime |
1440
|
「垃圾收集」(garbage collection,資源回收筒)被處理前的存活週期(預設:1440「秒」) |
可任意修改 |
session.serialize_handler |
php
|
處理連續資料方式的模式,本功能只有 WDDX 模組或 PHP 內部使用。內定值為 php。 |
可任意修改 |
session.cookie_lifetime |
0
|
session使用cookie的存活週期;以「秒」為單位(預設:隨瀏覽器關閉即消失) |
可任意修改 |
session.cookie_path |
/
|
session使用cookie的路徑(預設:與domain相同或根路徑) |
可任意修改 |
session.cookie_domain |
|
session使用cookie的網域名稱 |
可任意修改 |
session.cookie_secure |
|
session使用cookie的安全性 |
可任意修改 |
session.use_cookies |
1
|
session使用cookie的功能(預設:啟用) |
可任意修改 |
session.use_only_cookies |
0
|
僅使用cookie方式來傳遞session,不可利用URLs方式(預設:關) |
可任意修改 |
session.referer_check |
|
session在重新整理時檢查session是否還存在 |
可任意修改 |
session.entropy_file |
|
特別設定 session 值的檔案 |
可任意修改 |
session.entropy_length |
0
|
特別設定 session 值的長度(預設:關) |
可任意修改 |
session.cache_limiter |
nocache
|
使用cache限制器(預設:不用要cache) |
可任意修改 |
session.cache_expire |
180
|
使用cache存活時間 |
可任意修改 |
session.use_trans_sid |
0
|
使用sid值(session id)傳送模式(基於安全,預設:關閉) |
須在php.ini
或ttp.conf修改 |
url_rewriter.tags |
a=href,
area=href,
frame=src,
input=src,
form=fakeentry
|
網址(url)重新導向的標籤(tag) |
可任意修改 |
如果要改變這些設定,可直接修改 php.ini
再重新啟動 Web Server,也可以利用 ini_set( )函數來設定,設定方式如下:
ini_set ("參數名稱",
"新的參數值");
|
|
使用Session時,不外乎三個程序:
第一:啟動session功能 ─ 使用 session_start( ) 函數
第二:註冊session變數 ─ 使用 session_register( )
函數
(或用$_SESSION、$HTTP_SESSION_VARS )
第三:清除session變數或檔案 ─ 使用 session_unregister( )或
session_destroy( )函數
當然,如果想知道session的狀況,例如:
取得 session 的id值(與session檔案名稱,就是sess_後面接的32字元) ─ 使用
session_id ( )函數
查看要傳遞的變數是否已被註冊 ─ 使用 session_is_registerd( ) 函數
接下來,先介紹session各函數的語法,再用範例的方式來綜合介紹如何使用session:
|
|
|
|
session_start函數 |
語法
|
session_start( ) |
說明
|
建立一個session或在已啟動session的狀況下,繼續目前session id的「傳值」狀態,這類似GET、POST或cookie一樣。
注意:
- 如果使用的狀態是屬於cookie base的session傳遞方式,之後程式的開頭都必須使用
session_start( )函數。
- 另外,在使用session_start( )函數時,在session_start(
)之前都不可以有任何的結果輸出,例如不可以在session_start( )之前使用echo 輸出變數或將session_start(
)嵌入在網頁中,其他html語法先輸出,否則會出現錯誤訊息。
|
傳回值
|
true |
範例
|
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
|
<?php session_start(); //啟動 session echo '>>第一頁<<';
$_SESSION['color'] = '藍色'; $_SESSION['city'] = '台中市'; $_SESSION['time'] = date("Y年m月d日 H時i分s秒"); // 這是連結到另一個php程式, // 如果可以使用 cookie方式, //則利用以下方式連結到「第二頁」的程式
//注意這裡用單引號 echo '<br /><a href="ch7-2-1a.php">第二頁(cookie)</a>';
// 如果需用,利用長的session id值的url方式傳遞 echo '<br /><a href="ch7-2-1a.php?'.SID. '">第二頁(URLs)</a>';
?>
|
|
第02行:啟動 session,此時PHP會將session
id暫在到一個變數名稱「PHPSESSID」及session
id 值存在cookie裡;同時建立一個session檔案。
|
第05、06、07行:利用$_SESSION將變數「color」及值記錄到session檔案裡。 |
第14行:如果php.ini有將「session.use_trans_sid」設定為「1」,則可正常傳值到第二頁
;網址會自動加上(舉例)「?PHPSESSID=8234c3f661bd1eac450c23d5650e0881」。 |
第17行:如果php.ini將「session.use_trans_sid」設定為「0」(預設值),則需要利用URLs方式傳遞
session,「SID」是PHP在啟動session後自動產生的變數名稱,例如「PHPSESSID=8234c3f661bd1eac450c23d5650e0881」,所以超連結的網址會變為:
「ch7-2-1a.php?PHPSESSID=8234c3f661bd1eac450c23d5650e0881」。
|
|
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11:
|
<?php session_start();
echo '>>第二頁<< <br />'; echo $_SESSION['color']."<br>"; echo $_SESSION['city']."<br>"; echo date("Y年m月d日 H時i分s秒")." ==> ".$_SESSION['time'];
// 如果需用,利用長session id的方式傳遞回第一頁 echo '<br /><a href="ch7-2-1.php?'. SID . '">第一頁</a>'; ?>
|
|
第02行:傳遞過來的第二頁,也要先啟動session
|
第05、06、07行:直接輸出結果;如果沒有輸出結果,則應該是php.ini
「session.use_trans_sid」設定為「0」,無法傳遞session
id給第二頁程式找到session的檔案。 |
|
|
|
|
|
|
session_register 函數 |
語法
|
session_register( mixed name [, mixed ...]) |
說明
|
註冊新的變數到session檔裡。
注意:
- 如果session_register( )沒有作用或系統提出警告,可能是php.ini的「register_globals
= Off」
- register_globals: 注意: 自 PHP 4.2.0 版起,register_globals的指令已預設為
off。PHP 社群鼓勵所有使用者不要依賴此指令,轉而使用其他方法,如 superglobals(將在範例中示範)。
|
傳回值
|
bool |
範例
|
01: 02: 03: 04: 05: 06: 07: 08: 09:
|
<?php $abc = "最原始的方法"; session_register("abc");
$_SESSION["xyz"] = "第二種方法";
$HTTP_SESSION_VARS["third"] = "第三種方法";
?>
|
|
第03行:註冊session的變數名稱 abc,並將值置入。注意,在session_register(
) 函數內,註冊的是名稱的「字串」,不用加「$」。
|
第05行:這是利用所謂superblobals方式註冊變數名稱「
xyz 」及值。 |
第14行:這是利用所謂superblobals方式註冊變數名稱「
third 」及值。 |
此外,請特別注意:如果在session_register(
)函數前沒有使用 session_start( )來啟動時,會自動呼叫 session_start( );而 $_SESSION
及 $HTTP_SESSION_VARS 方式並不會呼叫 ,須在使用前事先 session_start( ) 才有作用。
|
|
|
|
|
|
|
session_unregister 函數 |
語法
|
session_unregister ( string name) |
說明
|
刪除session的變數。
注意:須先啟動session_start( )函數才可正常清除。
|
傳回值
|
bool,如果清除成功,將回傳TRUE。 |
範例
|
01: 02: 03: 04: 05:
|
<?php session_start( );
session_unregister("abc"); //假設 $abc = "123" ?>
|
|
|
|
|
|
|
|
session_destroy 函數 |
語法
|
session_destroy ( ) |
說明
|
結束session,並將儲存session的檔案刪除。
注意:須先啟動session_start( )函數才可正常運作。
|
傳回值
|
bool,如果清除成功,將回傳TRUE;否則傳回 FALSE。 |
範例
|
01: 02: 03: 04: 05: 06: 07:
|
<?php session_start( );
session_unset( );
session_destroy( ); ?>
|
|
第02行:啟動session |
第04行:清除session檔裡所有的資料; 如果要使用session_destroy(
)函數,這動作可有可無。 |
第06行:刪除session檔 |
|
|
|
|
|
session 函式 |
|
session_cache_expire |
傳回目前cache存活時間Return current cache expire |
session_cache_limiter |
取得或設計目前cache的限制器 |
session_decode |
從某一字串中進行session資料的解碼 |
session_destroy |
終結一個session的所有資料 |
session_encode |
把session資料的字串進行編碼 |
session_get_cookie_params |
取得session在cookie的參數 |
session_id |
取得或設定目前的 session id |
session_is_registered |
找出在session中已註冊的全域變數 |
session_module_name |
取得或設定目前session的組態 |
session_name |
取得或設定目前session的名稱(預設是PHPSESSID) |
session_regenerate_id |
Update the current session id with a newly generated one |
session_register |
註冊一個或數個全域變數到目前的session裡 |
session_save_path |
取得或設定目前session檔案的儲存路徑 |
session_set_cookie_params |
設定session在cookie的參數 |
session_set_save_handler |
設定使用者層次的session儲存功能 |
session_start |
啟動session |
session_unregister |
註消目前在session裡的變數名稱 |
session_unset |
釋放所有在session裡的資料 |
session_write_close |
寫入session資料並結束session功能 |
|
|
|