/ThinkPHP/Extend/Library/ORG/Util/Session.class.php

https://bitbucket.org/zjut/labs · PHP · 628 lines · 206 code · 38 blank · 384 comment · 42 complexity · 48d122af0b4a708a9e97d05139764c6c MD5 · raw file

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