目录
PHP实现利用MySQL保存session的方法,mysqlsession
怎做个会员登陆系统(用到php session但不用MySQL用TXT文件保存用户信息)
PHP中Session保存问题
首页 后端开发 php教程 PHP实现利用MySQL保存session的方法,mysqlsession_PHP教程

PHP实现利用MySQL保存session的方法,mysqlsession_PHP教程

Jul 13, 2016 am 10:20 AM
mysql php session

PHP实现利用MySQL保存session的方法,mysqlsession

session是PHP程序设计中服务器端用来保存用户信息的一个变量,具有非常广泛的应用价值。本文实例讲述了PHP实现利用MySQL保存session的方法。分享给大家供大家参考之用。具体步骤如下:

本文实例的实现环境为:

PHP 5.4.24
MySQL 5.6.19
OS X 10.9.4/Apache 2.2.26

一、代码部分

1.SQL语句:

1

2

3

4

5

6

7

CREATE TABLE `session` (

 `skey` char(32) CHARACTER SET ascii NOT NULL,

 `data` text COLLATE utf8mb4_bin,

 `expire` int(11) NOT NULL,

 PRIMARY KEY (`skey`),

 KEY `index_session_expire` (`expire`) USING BTREE

) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

登录后复制

2.PHP部分代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

<&#63;php

/*

 * 连接数据库所需的DNS、用户名、密码等,一般情况不会在代码中进行更改,

 * 所以使用常量的形式,可以避免在函数中引用而需要global。

 */

define('SESSION_DNS', 'mysql:host=localhost;dbname=db;charset=utf8mb4');

define('SESSION_USR', 'usr');

define('SESSION_PWD', 'pwd');

define('SESSION_MAXLIFETIME', get_cfg_var('session.gc_maxlifetime'));

 

//创建PDO连接

//持久化连接可以提供更好的效率

function getConnection() {

  try {

    $conn = new PDO(SESSION_DNS, SESSION_USR, SESSION_PWD, array(

      PDO::ATTR_PERSISTENT => TRUE,

      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,

      PDO::ATTR_EMULATE_PREPARES => FALSE

    ));

    return $conn;

  } catch (Exception $ex) {

 

  }

}

 

//自定义的session的open函数

function sessionMysqlOpen($savePath, $sessionName) {

  return TRUE;

}

 

//自定义的session的close函数

function sessionMysqlClose() {

  return TRUE;

}

/*

 * 由于一般不会把用户提交的数据直接保存到session,所以普通情况不存在注入问题。

 * 且处理session数据的SQL语句也不会多次使用。因此预处理功能的效益无法体现。

 * 所以,实际工程中可以不必教条的使用预处理功能。

 */

/*

 * sessionMysqlRead()函数中,首先通过SELECT count(*)来判断sessionID是否存在。

 * 由于MySQL数据库提供SELECT对PDOStatement::rowCount()的支持,

 * 因此,实际的工程中可以直接使用rowCount()进行判断。

 */

//自定义的session的read函数

//SQL语句中增加了“expire > time()”判断,用以避免读取过期的session。

function sessionMysqlRead($sessionId) {

  try {

    $dbh = getConnection();

    $time = time();

    $sql = 'SELECT count(*) AS `count` FROM session WHERE skey = &#63; and expire > &#63;';

    $stmt = $dbh->prepare($sql);

    $stmt->execute(array($sessionId, $time));

    $data = $stmt->fetch(PDO::FETCH_ASSOC)['count'];

    if ($data = 0) {

      return '';

    }

     

    $sql = 'SELECT `data` FROM `session` WHERE `skey` = &#63; and `expire` > &#63;';

    $stmt = $dbh->prepare($sql);

    $stmt->execute(array($sessionId, $time));

    $data = $stmt->fetch(PDO::FETCH_ASSOC)['data'];

    return $data;

  } catch (Exception $e) {

    return '';

  }

}

 

//自定义的session的write函数

//expire字段存储的数据为当前时间+session生命期,当这个值小于time()时表明session失效。

function sessionMysqlWrite($sessionId, $data) {

  try {

    $dbh = getConnection();

    $expire = time() + SESSION_MAXLIFETIME;

 

    $sql = 'INSERT INTO `session` (`skey`, `data`, `expire`) '

        . 'values (&#63;, &#63;, &#63;) '

        . 'ON DUPLICATE KEY UPDATE data = &#63;, expire = &#63;';

    $stmt = $dbh->prepare($sql);

    $stmt->execute(array($sessionId, $data, $expire, $data, $expire));

  } catch (Exception $e) {

    echo $e->getMessage();

  }

}

 

//自定义的session的destroy函数

function sessionMysqlDestroy($sessionId) {

  try {

    $dbh = getConnection();

    $sql = 'DELETE FROM `session` where skey = &#63;';

    $stmt = $dbh->prepare($sql);

    $stmt->execute(array($sessionId));

    return TRUE;

  } catch (Exception $e) {

    return FALSE;

  }

}

 

//自定义的session的gc函数

function sessionMysqlGc($lifetime) {

  try {

    $dbh = getConnection();

    $sql = 'DELETE FROM `session` WHERE expire < &#63;';

    $stmt = $dbh->prepare($sql);

    $stmt->execute(array(time()));

    $dbh = NULL;

    return TRUE;

  } catch (Exception $e) {

    return FALSE;

  }

}

 

//自定义的session的session id设置函数

/*

 * 由于在session_start()之前,SID和session_id()均无效,

 * 故使用$_GET[session_name()]和$_COOKIE[session_name()]进行检测。

 * 如果此两者均为空,则表明session尚未建立,需要为新session设置session id。

 * 通过MySQL数据库获取uuid作为session id可以更好的避免session id碰撞。

 */

function sessionMysqlId() {

  if (filter_input(INPUT_GET, session_name()) == '' and

      filter_input(INPUT_COOKIE, session_name()) == '') {

    try {

      $dbh = getConnection();

      $stmt = $dbh->query('SELECT uuid() AS uuid');

      $data = $stmt->fetch(PDO::FETCH_ASSOC)['uuid'];

      $data = str_replace('-', '', $data);

      session_id($data);

      return TRUE;

    } catch (Exception $ex) {

      return FALSE;

    }

  }

}

 

//session启动函数,包括了session_start()及其之前的所有步骤。

function startSession() {

  session_set_save_handler(

      'sessionMysqlOpen',

      'sessionMysqlClose',

      'sessionMysqlRead',

      'sessionMysqlWrite',

      'sessionMysqlDestroy',

      'sessionMysqlGc');

  register_shutdown_function('session_write_close');

  sessionMysqlId();

  session_start();

}

登录后复制

二、简介

1.使用MySQL保存session,需要保存三个关键性的数据:session id、session数据、session生命期。

2.考虑到session的使用方式,没必要使用InnoDB引擎,MyISAM引擎可以获得更好的性能。如果环境允许,可以尝试使用MEMORY引擎。

3.保存session数据的列,有需要的话,可以使用utf8或utf8mb4字符集;保存session id的列则没有必要,一般情况使用ascii字符集就可以了,可以节约存储成本。

4.保存session生命期的列,可以根据工程需要进行设计。比如datetime类型、timestamp类型、int类型。对于datetime、int类型可以保存session生成时间或过期时间。

5.如果有必要可以扩展session表的列并修改读、写函数以支持(维护)相关列来保存诸如用户名等信息。

6.当前版本,只要通过session_set_save_handler注册自定义的会话维护函数就可以,不需要在其之前使用session_module_name('user')函数。

7.当read函数获取数据并返回,PHP会自动对其进行反序列化,一般情况请不要对数据进行更改。

8.PHP传递给write函数的date参数是序列化之后的session数据,直接保存即可,一般情况请不要对数据进行更改。

9.按照本段代码的逻辑,PHP配置选项关于会话生命期的设置已经不再有效,这个值可以自行维护,不一定需要通过get_cfg_var获取。

10.sessionMysqlId()函数是为了避免大用户量、多台Web服务器情况下的碰撞,一般情况PHP自动生成的session id是可以满足用户要求的。

三、需求

当用户量非常大,需要多台服务器提供应用的时候,使用MySQL存储会话相对使用会话文件具有一定的优越性。比如具有最小的存储开销,比如可以避免文件共享带来的复杂性,比如可以更好的避免发生碰撞,比如相比会话文件共享具有更好的性能。总体上来说,当访问量剧增的时候,如果使用数据库保存会话带来的问题是线性增长的,那么使用会话文件带来的问题几乎是爆炸性的。好吧,换一个更直白的说法吧:如果您的应用用户量不大,其实让PHP自己处理session就好了,没必要考虑MySQL

四、参考函数及概念部分:

1 http://cn2.php.net/manual/zh/function.session-set-save-handler.php
2 http://cn2.php.net/manual/zh/session.idpassing.php
3 http://cn2.php.net/manual/zh/pdo.connections.php
4 http://cn2.php.net/manual/zh/pdo.prepared-statements.php
5 http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#insert

希望本文所述实例对大家PHP程序设计有所帮助。

怎做个会员登陆系统(用到php session但不用MySQL用TXT文件保存用户信息)

这个问题,可以用到数组存储,最后输出成分隔的字符串,是多字符串的操作。
我可以发一份示例代码给你。
 

PHP中Session保存问题

php保存session 默认的是采用的文件的方式来保存的,这仅仅在文件的空间开销很小的windows上是可以采用的,但是如果我们采用uinx或者是liux上的文件系统的时候,这样的文件系统的文件空间开销是很大的,然而session是要时时刻刻的使用的,大量的用户就要创建很多的session文件,这样对整个的服务器带来性能问题,另一方面,如果服务器起采用群集的方式的话就不能保持session的一致性,所以我们就绪要采用数据库的方式来保存session,这样,不管有几台服务器同时使用,只要把他们的session保存在一台数据库服务器上就可以保存session的完整了,具体如何来实现请继续看下去。
  php的session默认的情况下是采用的文件方式来保存的,我们在php的配制文件php.ini中可以看到这样的一行,session.save_handler="files",这样的意思就是采用文件来保存session 的,要采用数据库来保存的话,我们需要修改成用户模式,改称 session.save_handler="use"就可以了,但是,这仅仅是说明我门没有采用文件的方式存储session,我们还要选择数据库和建立数据库的表。
  建立数据库和数据库的表结构,我们可以采用php可以使用的任何的数据库,因为php和mysql的结合最好,我就使用mysql来做事例,当然根据你的需要可以改称别的数据库,同时因为mysql没有事物的功能,这也比别的数据库更快,然而保存session 不需要事物处理的,在这里我觉得更好。
  创建数据库 , CREATE DATABASE 'session'; 创建表结构 CREATE TABLE 'session'( id CHAR(30) NOT NULL , 'user 'CHAR(30), data CHAR(3000) ,PARMIRY BY ('id') );
编写php文件
$con =mysql_connection("127.0.0.1","user" , "pass");
mysql_select_db("session");
function open($save_path, $session_name)
{
return(true);
}
function close()
{
return(true);
}
function read($id)
{
if($result = mysql_query("SELECT * FROM session WHERE id='$id'"))
{
if($row = mysql_felth_row($result ))
{ return $row["data"]; }
}
else
{
return "";
}
}
function write($id, $sess_data)
{
if($result = mysql_query("UPDATE session SET data='$sess_data......余下全文>>
 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/868231.htmlTechArticlePHP实现利用MySQL保存session的方法,mysqlsession session是PHP程序设计中服务器端用来保存用户信息的一个变量,具有非常广泛的应用价值。本文...
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南

CakePHP 日期和时间 CakePHP 日期和时间 Sep 10, 2024 pm 05:27 PM

CakePHP 日期和时间

CakePHP 文件上传 CakePHP 文件上传 Sep 10, 2024 pm 05:27 PM

CakePHP 文件上传

讨论 CakePHP 讨论 CakePHP Sep 10, 2024 pm 05:28 PM

讨论 CakePHP

如何修复 MySQL 8.4 上的 mysql_native_password 未加载错误 如何修复 MySQL 8.4 上的 mysql_native_password 未加载错误 Dec 09, 2024 am 11:42 AM

如何修复 MySQL 8.4 上的 mysql_native_password 未加载错误

如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 Dec 20, 2024 am 11:31 AM

如何设置 Visual Studio Code (VS Code) 进行 PHP 开发

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

CakePHP 快速指南

CakePHP 创建验证器 CakePHP 创建验证器 Sep 10, 2024 pm 05:26 PM

CakePHP 创建验证器

See all articles