下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)現(xiàn)環(huán)境:php 5.4.24mysql 5.6.19os x 10.9.4/apache 2.2.26一、代碼Icreate table 'session' (2'skey' char(32) character set ascii not null,3'data' text collate utf8mb4_bin,4'expire' int(11) not null,5primary key ('skey'),6key 'index_session_expire' ('expire
2、9;) using btree7) engine=myisam default charset=utf8mb4 collate=utf8mb4_bin;001<?php002/*003*連接數(shù)據(jù)庫(kù)所需的dns、用戶名、密碼等,一般情況不會(huì)在代碼中進(jìn)行更改,004*所以使用常量的形式,可以避免在函數(shù)中引用而需要global。005*/006define('session_dns', 'mysql:host=localhost;dbname=db;charset=utf8mb4');007define('session_usr',
3、39;usr');008define('session_pwd', 'pwd');009define('session_maxlifetime', get_cfg_var('session.gc_maxlifetime');010011/創(chuàng)建pdo連接012/持久化連接可以提供更好的效率013function getconnection() 014try 015$conn = new pdo(session_dns, session_usr, session_pwd, array(016pdo:attr_persisten
4、t => true,017pdo:attr_errmode => pdo:errmode_exception,018pdo:attr_emulate_prepares => false019);020return $conn;021 catch (exception $ex) 022023024025026自定義的session的open函數(shù)027function sessionmysqlopen($savepath, $sessionname) 028return true;029030031自定義的session的close函數(shù)032functio
5、n sessionmysqlclose() 033return true;034035/*036*由于一般不會(huì)把用戶提交的數(shù)據(jù)直接保存到session,所以普通情況不存在注入問題。037*且處理session數(shù)據(jù)的sql語(yǔ)句也不會(huì)多次使用。因此預(yù)處理功能的效益無法體現(xiàn)。038*所以,實(shí)際工程中可以不必教條的使用預(yù)處理功能。039*/040/*041* sessionmysqlread()函數(shù)中,首先通過 select count(*)來判斷 sessionid 是否存在。042* 由于 mysql 數(shù)據(jù)庫(kù)提供 select 對(duì) pdostatement:rowcount()的支持,043*因此
6、,實(shí)際的工程中可以直接使用rowcount()進(jìn)行判斷。044*/045自定義的session的read函數(shù)046/sql語(yǔ)句中增加了 " expire > time()”判斷,用以避免讀取過期的sessioru047function sessionmysqlread($sessionid) 048try 049$dbh = getconnection();050$time = time();051052$sql = 'select count(*) as 'count' from session '053. 'where ske
7、y = ? and expire > ?'054$stmt = $dbh->prepare($sql);055$stmt->execute(array($sessionid, $time);056$data = $stmt->fetch(pdo:fetch_assoc)'count'057if ($data = 0) 058return ''059060061$sql = 'select 'data' from 'session' '062. '
8、;where 'skey' = ? and 'expire' > ?'063$stmt = $dbh->prepare($sql);064$stmt->execute(array($sessionid, $time);065$data = $stmt->fetch(pdo:fetch_assoc)'data'066return $data;067 catch (exception $e) 068return ''069070071072/自定義的session的wri
9、te函數(shù)073/expire字段存儲(chǔ)的數(shù)據(jù)為當(dāng)前時(shí)間+session生命期,當(dāng)這個(gè)值小于time()時(shí)表明 session 失效。074function sessionmysqlwrite($sessionid, $data) 075try 076$dbh = getconnection();077$expire = time() + session_maxlifetime;078079$sql = 'insert into 'session' ('skey', 'data', 'expire')'080.
10、9;values (?, ?, ?)'081. 'on duplicate key update data = ?, expire = ?'082$stmt = $dbh->prepare($sql);083$stmt->execute(array($sessionid, $data, $expire, $data, $expire);084 catch (exception $e) 085echo $e->getmessage();086087088089自定義的session的destroy函數(shù)090function ses
11、sionmysqldestroy($sessionid) 091try 092$dbh = getconnection();093094$sql = 'delete from 'session' where skey = ?'095$stmt = $dbh->prepare($sql);096$stmt->execute(array($sessionid);097return true;098 catch (exception $e) 099return false;100101102103自定義的session的gc函數(shù)104fun
12、ction sessionmysqlgc($lifetime) 105try 106$dbh = getconnection();107108$sql = 'delete from 'session' where expire < ?'109$stmt = $dbh->prepare($sql);110$stmt->execute(array(time();111$dbh = null;112return true;113 catch (exception $e) 114return false;115116117118
13、/自定義的session的session id設(shè)置函數(shù) 119/*120* 由于在 session_start()之前,sid 和 session_id()均無效,121* 故使用 $_getsession_name()H $_cookiesession_name()進(jìn)行檢測(cè)。122*如果此兩者均為空,則表明session尚未建立,需要為新session設(shè)置session id。123*通過mysql數(shù)據(jù)庫(kù)獲取uuid作為session id可以更好的避免 session id碰撞。 124*/125function sessionmysqlid() 126if (filter_input(i
14、nput_get, session_name() = '' and127filter_input(input_cookie, session_name() = '') 128try 129$dbh = getconnection();130$stmt = $dbh->query('select uuid() as uuid');131$data = $stmt->fetch(pdo:fetch_assoc)'uuid'132$data = str_replace('-', ",
15、 $data);133session_id($data);134return true;135 catch (exception $ex) 136return false;137 138 139 140 141142/session啟動(dòng)函數(shù),包括了session_start()及其之前的所有步驟。143function startsession() 144session_set_save_handler(145'sessionmysqlopen', 146'sessionmysqlclose', 147'sessionmysqlread', 14
16、8'sessionmysqlwrite', 149'sessionmysqldestroy', 150'sessionmysqlgc');151register_shutdown_function('session_write_close');152sessionmysqlid();153session_start();154二、簡(jiǎn)介使用 mysql保存 session,需要保存三個(gè)關(guān)鍵性的數(shù)據(jù): session id、 session數(shù)據(jù)、session 生命期??紤]到session的使用方式,沒必要使用innodb引擎,myi
17、sam引擎可以獲得更好的性能。如果環(huán)境允許,可以嘗試使用memory引擎。保存session數(shù)據(jù)的列,有需要白話,可以使用 utf8或utf8mb4字符集;保存session id 的列則沒有必要,一般情況使用ascii字符集就可以了,可以節(jié)約存儲(chǔ)成本。保存session生命期的列,可以根據(jù)工程需要進(jìn)行設(shè)計(jì)。比如 datetime類型、timestamp 類型、int類型。對(duì)于datetime、int類型可以保存session生成時(shí)間或過期時(shí)間。如果有必要可以擴(kuò)展 session表的列并修改讀、寫函數(shù)以支持(維護(hù))相關(guān)列來保存諸 如用戶名等信息。當(dāng)前版本,只要通過session_set_save_handler注冊(cè)自定義的會(huì)話維護(hù)函數(shù)就可以,不需 要在其之前使用 session_module_name('use)函數(shù)。當(dāng)read函數(shù)獲取數(shù)據(jù)并返回,php會(huì)自動(dòng)對(duì)其進(jìn)行反序列化,一般情況請(qǐng)不要對(duì)數(shù)據(jù)進(jìn)行更改。php傳遞給write函數(shù)的date參數(shù)是序列化之后的 session數(shù)據(jù),直接保存即可,一般情 況請(qǐng)不要對(duì)數(shù)據(jù)進(jìn)行更改。按照本段代碼的邏輯,php配置選項(xiàng)關(guān)于會(huì)話生命期的設(shè)置已經(jīng)不再有效,這個(gè)值可以 自行維護(hù),不一定需要通過get_cfg_var獲取。sessionmysqlid()函數(shù)是為了避免大用戶量、多臺(tái)web服務(wù)器情況下的碰撞,一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度餐飲泔水回收與環(huán)保設(shè)施投資合同3篇
- 二零二五年礦山土地及資源使用權(quán)轉(zhuǎn)讓合同3篇
- 二零二五版白糖進(jìn)口許可證申請(qǐng)代理服務(wù)合同下載2篇
- 二零二五年度駕駛員押運(yùn)員安全責(zé)任及培訓(xùn)合同3篇
- 二零二五版企事業(yè)單位節(jié)能環(huán)保辦公電腦采購(gòu)合同2篇
- 二零二五版電子商務(wù)平臺(tái)借款及庫(kù)存商品質(zhì)押合同3篇
- 二零二五年紡織原料市場(chǎng)調(diào)研與分析合同2篇
- 小區(qū)下水管網(wǎng)清理疏通承包合同(2篇)
- 二零二五版房產(chǎn)買賣合同含抵押權(quán)轉(zhuǎn)移及貸款利率協(xié)商協(xié)議0183篇
- 2025年度農(nóng)業(yè)科技推廣財(cái)產(chǎn)贈(zèng)與合同3篇
- 【譯林版】六年級(jí)英語(yǔ)(下冊(cè))單詞默寫單
- 高中英語(yǔ)名詞性從句講解
- 計(jì)算機(jī)二級(jí)wps題庫(kù)及答案
- 整套課件:工業(yè)催化
- 爆破安全管理知識(shí)培訓(xùn)
- 旅游地理學(xué)教案
- 煤矸石綜合利用途徑課件
- 企業(yè)信息公示聯(lián)絡(luò)員備案申請(qǐng)表
- 衛(wèi)生部關(guān)于發(fā)布《綜合醫(yī)院組織編制原則試行草案》的通知((78)衛(wèi)醫(yī)字第1689號(hào))
- 挑戰(zhàn)杯生命科學(xué)獲獎(jiǎng)作品范例
- 醫(yī)院崗位設(shè)置與人員編制標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論