백엔드 개발 PHP 튜토리얼 PHP는 MySQL_php 기술을 사용하여 세션을 저장하는 방법을 구현합니다.

PHP는 MySQL_php 기술을 사용하여 세션을 저장하는 방법을 구현합니다.

May 16, 2016 pm 08:37 PM
mysql php session 저장

세션은 PHP 프로그래밍에서 사용자 정보를 저장하기 위해 서버에서 사용하는 변수로 활용 범위가 매우 넓습니다. 이 기사의 예에서는 PHP가 MySQL을 사용하여 세션을 저장하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 단계는 다음과 같습니다.

이 글의 예시 구현 환경은 다음과 같습니다:

PHP 5.4.24
MySQL 5.6.19
OS X 10.9.4/아파치 2.2.26

1. 코드 부분

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();

}

로그인 후 복사

2. 소개

1. MySQL을 사용하여 세션을 저장할 때 세션 ID, 세션 데이터, 세션 수명이라는 세 가지 주요 데이터를 저장해야 합니다.

2. 세션 사용 방식을 고려하면 MyISAM 엔진을 사용할 필요가 없습니다. 환경이 허락한다면 MEMORY 엔진을 사용해 볼 수 있습니다.

3. 필요한 경우 세션 데이터를 저장하는 열에 utf8 또는 utf8mb4 문자 집합을 사용할 수 있습니다. 일반적으로 세션 ID를 저장하는 열에는 필요하지 않습니다. 보관 비용을 절약할 수 있습니다.

4. 세션 수명주기를 저장하는 열은 프로젝트 요구에 따라 설계할 수 있습니다. 예를 들어 날짜/시간 유형, 타임스탬프 유형, int 유형이 있습니다. datetime 및 int 유형의 경우 세션 생성 시간 또는 만료 시간을 저장할 수 있습니다.

5. 필요한 경우 세션 테이블의 열을 확장하고 읽기 및 쓰기 기능을 수정하여 사용자 이름과 같은 정보를 저장하는 관련 열을 지원(유지)할 수 있습니다.

6. 현재 버전에서는 session_set_save_handler를 통해 사용자 정의 세션 유지 함수만 등록하면 됩니다. 그 전에는 session_module_name('user') 함수를 사용할 필요가 없습니다.

7. 읽기 함수가 데이터를 가져와 반환하면 PHP는 자동으로 데이터를 역직렬화합니다.

8. PHP가 쓰기 함수에 전달한 날짜 매개변수는 직렬화 후의 세션 데이터이며 일반적으로 데이터를 변경하지 마세요.

9. 이 코드의 논리에 따르면 PHP 구성 옵션의 세션 수명 설정은 더 이상 유효하지 않습니다. 이 값은 자체적으로 유지 관리될 수 있으며 반드시 get_cfg_var를 통해 얻을 필요는 없습니다.

10.sessionMysqlId() 함수는 사용자 수가 많고 웹 서버가 여러 개일 때 충돌을 피하기 위한 것입니다. 일반적으로 PHP에서 자동으로 생성되는 세션 ID는 사용자 요구 사항을 충족할 수 있습니다.

3. 수요

사용자 수가 매우 많고 애플리케이션 제공을 위해 여러 서버가 필요한 경우 MySQL을 사용하여 세션을 저장하는 것은 세션 파일을 사용하는 것보다 몇 가지 장점이 있습니다. 예를 들어, 스토리지 오버헤드가 최소화되고 파일 공유로 인한 복잡성을 피할 수 있으며 충돌을 더 잘 피할 수 있고 세션 파일 공유보다 성능이 더 좋습니다. 일반적으로 방문 횟수가 급격하게 증가할 때 세션을 저장하기 위해 데이터베이스를 사용함으로써 발생하는 문제가 선형적으로 증가한다면 세션 파일을 사용하여 발생하는 문제는 거의 폭발적입니다. 좀 더 간단한 방법으로 설명하겠습니다. 애플리케이션에 사용자 수가 적은 경우에는 실제로 PHP가 세션을 자체적으로 처리하도록 할 수 있습니다. MySQL을 고려할 필요는 없습니다.

4. 참조 기능 및 개념:

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 프로그래밍에 종사하는 모든 사람에게 도움이 되기를 바랍니다.

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP의 미래 : 적응 및 혁신 PHP의 미래 : 적응 및 혁신 Apr 11, 2025 am 12:01 AM

PHP의 미래는 새로운 기술 트렌드에 적응하고 혁신적인 기능을 도입함으로써 달성 될 것입니다. 1) 클라우드 컴퓨팅, 컨테이너화 및 마이크로 서비스 아키텍처에 적응, Docker 및 Kubernetes 지원; 2) 성능 및 데이터 처리 효율을 향상시키기 위해 JIT 컴파일러 및 열거 유형을 도입합니다. 3) 지속적으로 성능을 최적화하고 모범 사례를 홍보합니다.

PHP vs. Python : 차이점 이해 PHP vs. Python : 차이점 이해 Apr 11, 2025 am 12:15 AM

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

phpmyadmin을 여는 방법 phpmyadmin을 여는 방법 Apr 10, 2025 pm 10:51 PM

다음 단계를 통해 phpmyadmin을 열 수 있습니다. 1. 웹 사이트 제어판에 로그인; 2. phpmyadmin 아이콘을 찾고 클릭하십시오. 3. MySQL 자격 증명을 입력하십시오. 4. "로그인"을 클릭하십시오.

MySQL 및 SQL : 개발자를위한 필수 기술 MySQL 및 SQL : 개발자를위한 필수 기술 Apr 10, 2025 am 09:30 AM

MySQL 및 SQL은 개발자에게 필수적인 기술입니다. 1.MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템이며 SQL은 데이터베이스를 관리하고 작동하는 데 사용되는 표준 언어입니다. 2.MYSQL은 효율적인 데이터 저장 및 검색 기능을 통해 여러 스토리지 엔진을 지원하며 SQL은 간단한 문을 통해 복잡한 데이터 작업을 완료합니다. 3. 사용의 예에는 기본 쿼리 및 조건 별 필터링 및 정렬과 같은 고급 쿼리가 포함됩니다. 4. 일반적인 오류에는 구문 오류 및 성능 문제가 포함되며 SQL 문을 확인하고 설명 명령을 사용하여 최적화 할 수 있습니다. 5. 성능 최적화 기술에는 인덱스 사용, 전체 테이블 스캔 피하기, 조인 작업 최적화 및 코드 가독성 향상이 포함됩니다.

MySQL : 쉽게 학습하기위한 간단한 개념 MySQL : 쉽게 학습하기위한 간단한 개념 Apr 10, 2025 am 09:29 AM

MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1) 데이터베이스 및 테이블 작성 : CreateAbase 및 CreateTable 명령을 사용하십시오. 2) 기본 작업 : 삽입, 업데이트, 삭제 및 선택. 3) 고급 운영 : 가입, 하위 쿼리 및 거래 처리. 4) 디버깅 기술 : 확인, 데이터 유형 및 권한을 확인하십시오. 5) 최적화 제안 : 인덱스 사용, 선택을 피하고 거래를 사용하십시오.

PHP : 죽어 가거나 단순히 적응하고 있습니까? PHP : 죽어 가거나 단순히 적응하고 있습니까? Apr 11, 2025 am 12:13 AM

PHP는 죽지 않고 끊임없이 적응하고 진화합니다. 1) PHP는 1994 년부터 새로운 기술 트렌드에 적응하기 위해 여러 버전 반복을 겪었습니다. 2) 현재 전자 상거래, 컨텐츠 관리 시스템 및 기타 분야에서 널리 사용됩니다. 3) PHP8은 성능과 현대화를 개선하기 위해 JIT 컴파일러 및 기타 기능을 소개합니다. 4) Opcache를 사용하고 PSR-12 표준을 따라 성능 및 코드 품질을 최적화하십시오.

SQL 데이터베이스 오류를 보는 방법 SQL 데이터베이스 오류를 보는 방법 Apr 10, 2025 pm 12:09 PM

SQL 데이터베이스 오류를 보는 방법은 다음과 같습니다. 1. 오류 메시지보기 직접; 2. 표시 오류 및 경고 명령을 사용하십시오. 3. 오류 로그에 액세스; 4. 오류 코드를 사용하여 오류의 원인을 찾으십시오. 5. 데이터베이스 연결 및 쿼리 구문을 확인하십시오. 6. 디버깅 도구를 사용하십시오.

phpmyadmin 연결 MySQL phpmyadmin 연결 MySQL Apr 10, 2025 pm 10:57 PM

phpmyadmin을 사용하여 MySQL에 연결하는 방법? phpmyadmin에 액세스하기위한 URL은 일반적으로 http : // localhost/phpmyadmin 또는 http : // [서버 IP 주소]/phpmyadmin입니다. MySQL 사용자 이름 및 비밀번호를 입력하십시오. 연결하려는 데이터베이스를 선택하십시오. "연결"버튼을 클릭하여 연결을 설정하십시오.

See all articles