Session.class.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2009 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: liu21st <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. // $Id$
  12. define("HTTP_SESSION_STARTED", 1);
  13. define("HTTP_SESSION_CONTINUED", 2);
  14. /**
  15. +------------------------------------------------------------------------------
  16. * Session管理类
  17. +------------------------------------------------------------------------------
  18. * @category Think
  19. * @package Think
  20. * @subpackage Util
  21. * @author liu21st <liu21st@gmail.com>
  22. * @version $Id$
  23. +------------------------------------------------------------------------------
  24. */
  25. class Session extends Think
  26. {//类定义开始
  27. /**
  28. +----------------------------------------------------------
  29. * 启动Session
  30. +----------------------------------------------------------
  31. * @static
  32. * @access public
  33. +----------------------------------------------------------
  34. * @return void
  35. +----------------------------------------------------------
  36. */
  37. static function start()
  38. {
  39. session_start();
  40. if (!isset($_SESSION['__HTTP_Session_Info'])) {
  41. $_SESSION['__HTTP_Session_Info'] = HTTP_SESSION_STARTED;
  42. } else {
  43. $_SESSION['__HTTP_Session_Info'] = HTTP_SESSION_CONTINUED;
  44. }
  45. Session::setExpire(C('SESSION_EXPIRE'));
  46. }
  47. /**
  48. +----------------------------------------------------------
  49. * 暂停Session
  50. +----------------------------------------------------------
  51. * @static
  52. * @access public
  53. +----------------------------------------------------------
  54. * @return void
  55. +----------------------------------------------------------
  56. */
  57. static function pause()
  58. {
  59. session_write_close();
  60. }
  61. /**
  62. +----------------------------------------------------------
  63. * 清空Session
  64. +----------------------------------------------------------
  65. * @static
  66. * @access public
  67. +----------------------------------------------------------
  68. * @return void
  69. +----------------------------------------------------------
  70. */
  71. static function clearLocal()
  72. {
  73. $local = Session::localName();
  74. unset($_SESSION[$local]);
  75. }
  76. /**
  77. +----------------------------------------------------------
  78. * 清空Session
  79. +----------------------------------------------------------
  80. * @static
  81. * @access public
  82. +----------------------------------------------------------
  83. * @return void
  84. +----------------------------------------------------------
  85. */
  86. static function clear()
  87. {
  88. $_SESSION = array();
  89. }
  90. /**
  91. +----------------------------------------------------------
  92. * 销毁Session
  93. +----------------------------------------------------------
  94. * @static
  95. * @access public
  96. +----------------------------------------------------------
  97. * @return void
  98. +----------------------------------------------------------
  99. */
  100. static function destroy()
  101. {
  102. unset($_SESSION);
  103. session_destroy();
  104. }
  105. /**
  106. +----------------------------------------------------------
  107. * 检测SessionID
  108. +----------------------------------------------------------
  109. * @static
  110. * @access public
  111. +----------------------------------------------------------
  112. * @return void
  113. +----------------------------------------------------------
  114. */
  115. static function detectID()
  116. {
  117. if(session_id()!='')
  118. {
  119. return session_id();
  120. }
  121. if (Session::useCookies()) {
  122. if (isset($_COOKIE[Session::name()])) {
  123. return $_COOKIE[Session::name()];
  124. }
  125. } else {
  126. if (isset($_GET[Session::name()])) {
  127. return $_GET[Session::name()];
  128. }
  129. if (isset($_POST[Session::name()])) {
  130. return $_POST[Session::name()];
  131. }
  132. }
  133. return null;
  134. }
  135. /**
  136. +----------------------------------------------------------
  137. * 设置或者获取当前Session name
  138. +----------------------------------------------------------
  139. * @param string $name session名称
  140. +----------------------------------------------------------
  141. * @static
  142. * @access public
  143. +----------------------------------------------------------
  144. * @return string 返回之前的Session name
  145. +----------------------------------------------------------
  146. */
  147. static function name($name = null)
  148. {
  149. return isset($name) ? session_name($name) : session_name();
  150. }
  151. /**
  152. +----------------------------------------------------------
  153. * 设置或者获取当前SessionID
  154. +----------------------------------------------------------
  155. * @param string $id sessionID
  156. +----------------------------------------------------------
  157. * @static
  158. * @access public
  159. +----------------------------------------------------------
  160. * @return void 返回之前的sessionID
  161. +----------------------------------------------------------
  162. */
  163. static function id($id = null)
  164. {
  165. return isset($id) ? session_id($id) : session_id();
  166. }
  167. /**
  168. +----------------------------------------------------------
  169. * 设置或者获取当前Session保存路径
  170. +----------------------------------------------------------
  171. * @param string $path 保存路径名
  172. +----------------------------------------------------------
  173. * @access public
  174. +----------------------------------------------------------
  175. * @return string
  176. +----------------------------------------------------------
  177. */
  178. static function path($path = null)
  179. {
  180. return !empty($path)? session_save_path($path):session_save_path();
  181. }
  182. /**
  183. +----------------------------------------------------------
  184. * 设置Session 过期时间
  185. +----------------------------------------------------------
  186. * @param integer $time 过期时间
  187. * @param boolean $add 是否为增加时间
  188. +----------------------------------------------------------
  189. * @static
  190. * @access public
  191. +----------------------------------------------------------
  192. * @return void
  193. +----------------------------------------------------------
  194. */
  195. static function setExpire($time, $add = false)
  196. {
  197. if ($add) {
  198. if (!isset($_SESSION['__HTTP_Session_Expire_TS'])) {
  199. $_SESSION['__HTTP_Session_Expire_TS'] = time() + $time;
  200. }
  201. // update session.gc_maxlifetime
  202. $currentGcMaxLifetime = Session::setGcMaxLifetime(null);
  203. Session::setGcMaxLifetime($currentGcMaxLifetime + $time);
  204. } elseif (!isset($_SESSION['__HTTP_Session_Expire_TS'])) {
  205. $_SESSION['__HTTP_Session_Expire_TS'] = $time;
  206. }
  207. }
  208. /**
  209. +----------------------------------------------------------
  210. * 设置Session 闲置时间
  211. +----------------------------------------------------------
  212. * @param integer $time 闲置时间
  213. * @param boolean $add 是否为增加时间
  214. +----------------------------------------------------------
  215. * @static
  216. * @access public
  217. +----------------------------------------------------------
  218. * @return void
  219. +----------------------------------------------------------
  220. */
  221. static function setIdle($time, $add = false)
  222. {
  223. if ($add) {
  224. $_SESSION['__HTTP_Session_Idle'] = $time;
  225. } else {
  226. $_SESSION['__HTTP_Session_Idle'] = $time - time();
  227. }
  228. }
  229. /**
  230. +----------------------------------------------------------
  231. * 取得Session 有效时间
  232. +----------------------------------------------------------
  233. * @static
  234. * @access public
  235. +----------------------------------------------------------
  236. * @return void
  237. +----------------------------------------------------------
  238. */
  239. static function sessionValidThru()
  240. {
  241. if (!isset($_SESSION['__HTTP_Session_Idle_TS']) || !isset($_SESSION['__HTTP_Session_Idle'])) {
  242. return 0;
  243. } else {
  244. return $_SESSION['__HTTP_Session_Idle_TS'] + $_SESSION['__HTTP_Session_Idle'];
  245. }
  246. }
  247. /**
  248. +----------------------------------------------------------
  249. * 检查Session 是否过期
  250. +----------------------------------------------------------
  251. * @static
  252. * @access public
  253. +----------------------------------------------------------
  254. * @return boolean
  255. +----------------------------------------------------------
  256. */
  257. static function isExpired()
  258. {
  259. if (isset($_SESSION['__HTTP_Session_Expire_TS']) && $_SESSION['__HTTP_Session_Expire_TS'] < time()) {
  260. return true;
  261. } else {
  262. return false;
  263. }
  264. }
  265. /**
  266. +----------------------------------------------------------
  267. * 检查Session 是否闲置
  268. +----------------------------------------------------------
  269. * @static
  270. * @access public
  271. +----------------------------------------------------------
  272. * @return void
  273. +----------------------------------------------------------
  274. */
  275. static function isIdle()
  276. {
  277. if (isset($_SESSION['__HTTP_Session_Idle_TS']) && (($_SESSION['__HTTP_Session_Idle_TS'] + $_SESSION['__HTTP_Session_Idle']) < time())) {
  278. return true;
  279. } else {
  280. return false;
  281. }
  282. }
  283. /**
  284. +----------------------------------------------------------
  285. * 更新Session 闲置时间
  286. +----------------------------------------------------------
  287. * @static
  288. * @access public
  289. +----------------------------------------------------------
  290. * @return void
  291. +----------------------------------------------------------
  292. */
  293. static function updateIdle()
  294. {
  295. $_SESSION['__HTTP_Session_Idle_TS'] = time();
  296. }
  297. /**
  298. +----------------------------------------------------------
  299. * 设置Session 对象反序列化时候的回调函数
  300. * 返回之前设置
  301. +----------------------------------------------------------
  302. * @param string $callback 回调函数方法名
  303. +----------------------------------------------------------
  304. * @static
  305. * @access public
  306. +----------------------------------------------------------
  307. * @return boolean
  308. +----------------------------------------------------------
  309. */
  310. static function setCallback($callback = null)
  311. {
  312. $return = ini_get('unserialize_callback_func');
  313. if (!empty($callback)) {
  314. ini_set('unserialize_callback_func',$callback);
  315. }
  316. return $return;
  317. }
  318. /**
  319. +----------------------------------------------------------
  320. * 设置Session 是否使用cookie
  321. * 返回之前设置
  322. +----------------------------------------------------------
  323. * @param boolean $useCookies 是否使用cookie
  324. +----------------------------------------------------------
  325. * @static
  326. * @access public
  327. +----------------------------------------------------------
  328. * @return boolean
  329. +----------------------------------------------------------
  330. */
  331. static function useCookies($useCookies = null)
  332. {
  333. $return = ini_get('session.use_cookies') ? true : false;
  334. if (isset($useCookies)) {
  335. ini_set('session.use_cookies', $useCookies ? 1 : 0);
  336. }
  337. return $return;
  338. }
  339. /**
  340. +----------------------------------------------------------
  341. * 检查Session 是否新建
  342. +----------------------------------------------------------
  343. * @param boolean $useCookies 是否使用cookie
  344. +----------------------------------------------------------
  345. * @static
  346. * @access public
  347. +----------------------------------------------------------
  348. * @return boolean
  349. +----------------------------------------------------------
  350. */
  351. static function isNew()
  352. {
  353. return !isset($_SESSION['__HTTP_Session_Info']) ||
  354. $_SESSION['__HTTP_Session_Info'] == HTTP_SESSION_STARTED;
  355. }
  356. /**
  357. +----------------------------------------------------------
  358. * 取得当前项目的Session 值
  359. * 返回之前设置
  360. +----------------------------------------------------------
  361. * @param string $name
  362. +----------------------------------------------------------
  363. * @static
  364. * @access public
  365. +----------------------------------------------------------
  366. * @return boolean
  367. +----------------------------------------------------------
  368. */
  369. static function getLocal($name)
  370. {
  371. $local = Session::localName();
  372. if (!is_array($_SESSION[$local])) {
  373. $_SESSION[$local] = array();
  374. }
  375. return $_SESSION[$local][$name];
  376. }
  377. /**
  378. +----------------------------------------------------------
  379. * 取得当前项目的Session 值
  380. * 返回之前设置
  381. +----------------------------------------------------------
  382. * @param string $name
  383. +----------------------------------------------------------
  384. * @static
  385. * @access public
  386. +----------------------------------------------------------
  387. * @return boolean
  388. +----------------------------------------------------------
  389. */
  390. static function get($name)
  391. {
  392. if(isset($_SESSION[$name])) {
  393. return $_SESSION[$name];
  394. }else {
  395. return null;
  396. }
  397. }
  398. /**
  399. +----------------------------------------------------------
  400. * 设置当前项目的Session 值
  401. * 返回之前设置
  402. +----------------------------------------------------------
  403. * @param string $name
  404. * @param mixed $value
  405. +----------------------------------------------------------
  406. * @static
  407. * @access public
  408. +----------------------------------------------------------
  409. * @return boolean
  410. +----------------------------------------------------------
  411. */
  412. static function setLocal($name, $value)
  413. {
  414. $local = Session::localName();
  415. if (!is_array($_SESSION[$local])) {
  416. $_SESSION[$local] = array();
  417. }
  418. if (null === $value) {
  419. unset($_SESSION[$local][$name]);
  420. } else {
  421. $_SESSION[$local][$name] = $value;
  422. }
  423. return;
  424. }
  425. /**
  426. +----------------------------------------------------------
  427. * 设置当前项目的Session 值
  428. * 返回之前设置
  429. +----------------------------------------------------------
  430. * @param string $name
  431. * @param mixed $value
  432. +----------------------------------------------------------
  433. * @static
  434. * @access public
  435. +----------------------------------------------------------
  436. * @return boolean
  437. +----------------------------------------------------------
  438. */
  439. static function set($name, $value)
  440. {
  441. if (null === $value) {
  442. unset($_SESSION[$name]);
  443. } else {
  444. $_SESSION[$name] = $value;
  445. }
  446. return ;
  447. }
  448. /**
  449. +----------------------------------------------------------
  450. * 检查Session 值是否已经设置
  451. +----------------------------------------------------------
  452. * @param string $name
  453. +----------------------------------------------------------
  454. * @static
  455. * @access public
  456. +----------------------------------------------------------
  457. * @return boolean
  458. +----------------------------------------------------------
  459. */
  460. static function is_setLocal($name)
  461. {
  462. $local = Session::localName();
  463. return isset($_SESSION[$local][$name]);
  464. }
  465. /**
  466. +----------------------------------------------------------
  467. * 检查Session 值是否已经设置
  468. +----------------------------------------------------------
  469. * @param string $name
  470. +----------------------------------------------------------
  471. * @static
  472. * @access public
  473. +----------------------------------------------------------
  474. * @return boolean
  475. +----------------------------------------------------------
  476. */
  477. static function is_set($name)
  478. {
  479. return isset($_SESSION[$name]);
  480. }
  481. /**
  482. +----------------------------------------------------------
  483. * 设置或者获取 Session localname
  484. +----------------------------------------------------------
  485. * @param string $name
  486. +----------------------------------------------------------
  487. * @static
  488. * @access public
  489. +----------------------------------------------------------
  490. * @return string
  491. +----------------------------------------------------------
  492. */
  493. static function localName($name = null)
  494. {
  495. $return = (isset($GLOBALS['__HTTP_Session_Localname'])) ? $GLOBALS['__HTTP_Session_Localname'] : null;
  496. if (!empty($name)) {
  497. $GLOBALS['__HTTP_Session_Localname'] = md5($name);
  498. }
  499. return $return;
  500. }
  501. /**
  502. +----------------------------------------------------------
  503. * Session 初始化
  504. +----------------------------------------------------------
  505. * @static
  506. * @access private
  507. +----------------------------------------------------------
  508. * @return boolean
  509. +----------------------------------------------------------
  510. */
  511. static function _init()
  512. {
  513. ini_set('session.auto_start', 0);
  514. if (is_null(Session::detectID())) {
  515. Session::id(uniqid(dechex(mt_rand())));
  516. }
  517. // 设置Session有效域名
  518. Session::setCookieDomain(C('COOKIE_DOMAIN'));
  519. //设置当前项目运行脚本作为Session本地名
  520. Session::localName(APP_NAME);
  521. Session::name(C('SESSION_NAME'));
  522. Session::path(C('SESSION_PATH'));
  523. Session::setCallback(C('SESSION_CALLBACK'));
  524. }
  525. /**
  526. +----------------------------------------------------------
  527. * 设置Session use_trans_sid
  528. * 返回之前设置
  529. +----------------------------------------------------------
  530. * @param string $useTransSID
  531. +----------------------------------------------------------
  532. * @static
  533. * @access public
  534. +----------------------------------------------------------
  535. * @return string
  536. +----------------------------------------------------------
  537. */
  538. static function useTransSID($useTransSID = null)
  539. {
  540. $return = ini_get('session.use_trans_sid') ? true : false;
  541. if (isset($useTransSID)) {
  542. ini_set('session.use_trans_sid', $useTransSID ? 1 : 0);
  543. }
  544. return $return;
  545. }
  546. /**
  547. +----------------------------------------------------------
  548. * 设置Session cookie_domain
  549. * 返回之前设置
  550. +----------------------------------------------------------
  551. * @param string $sessionDomain
  552. +----------------------------------------------------------
  553. * @static
  554. * @access public
  555. +----------------------------------------------------------
  556. * @return string
  557. +----------------------------------------------------------
  558. */
  559. static function setCookieDomain($sessionDomain = null)
  560. {
  561. $return = ini_get('session.cookie_domain');
  562. if(!empty($sessionDomain)) {
  563. ini_set('session.cookie_domain', $sessionDomain);//跨域访问Session
  564. }
  565. return $return;
  566. }
  567. /**
  568. +----------------------------------------------------------
  569. * 设置Session gc_maxlifetime值
  570. * 返回之前设置
  571. +----------------------------------------------------------
  572. * @param string $gc_maxlifetime
  573. +----------------------------------------------------------
  574. * @static
  575. * @access public
  576. +----------------------------------------------------------
  577. * @return string
  578. +----------------------------------------------------------
  579. */
  580. static function setGcMaxLifetime($gcMaxLifetime = null)
  581. {
  582. $return = ini_get('session.gc_maxlifetime');
  583. if (isset($gcMaxLifetime) && is_int($gcMaxLifetime) && $gcMaxLifetime >= 1) {
  584. ini_set('session.gc_maxlifetime', $gcMaxLifetime);
  585. }
  586. return $return;
  587. }
  588. /**
  589. +----------------------------------------------------------
  590. * 设置Session gc_probability 值
  591. * 返回之前设置
  592. +----------------------------------------------------------
  593. * @param string $gc_maxlifetime
  594. +----------------------------------------------------------
  595. * @static
  596. * @access public
  597. +----------------------------------------------------------
  598. * @return string
  599. +----------------------------------------------------------
  600. */
  601. static function setGcProbability($gcProbability = null)
  602. {
  603. $return = ini_get('session.gc_probability');
  604. if (isset($gcProbability) && is_int($gcProbability) && $gcProbability >= 1 && $gcProbability <= 100) {
  605. ini_set('session.gc_probability', $gcProbability);
  606. }
  607. return $return;
  608. }
  609. /**
  610. +----------------------------------------------------------
  611. * 当前Session文件名
  612. +----------------------------------------------------------
  613. * @access public
  614. +----------------------------------------------------------
  615. * @return string
  616. +----------------------------------------------------------
  617. */
  618. static function getFilename()
  619. {
  620. return Session::path().'/sess_'.session_id();
  621. }
  622. }//类定义结束
  623. Session::_init();
  624. ?>