php教程 php手册 Discuz!X中SESSION机制实例详解

Discuz!X中SESSION机制实例详解

Jun 06, 2016 pm 07:43 PM
discuz

这篇文章主要介绍了Discuz!X中SESSION机制,以实例形式较为详细的分析了Discuz!X中SESSION机制的原理与数据库操作技巧,具有一定参考借鉴价值,需要的朋友可以参考

本文实例讲述了Discuz!X中SESSION机制。分享给大家供大家参考。具体如下:

在Discuz! X中一如继往的,SESSION 并没有使用 PHP 自带的 SESSION 机制,而是系统的一套自带的机制。

在数据库中可以看到有两个 SESSION 表:
一个是pre_common_adminsession,是管理员登录后台的 SESSION 表;
另一个是 pre_common_session 表,是所有用户在前台浏览页面时的 SESSION 表。
这两个表都是内存表(内存表的读写速度远高于 MYISAM 表及文本文件)。

在 Discuz! X 中 SESSION 与 COOKIE 是分不开的,因为 SESSION 就是从客户端读取的 COOKIE ,
然后由浏览页面时触发相关的函数执行,再写入数据库 SESSION 表。

我以登录流程为例来讲解程序具体是如何执行的。
在前台首页,点击登录后,弹出一个登录窗口,填写好数据后,提交。form表单提交的 URL 是:

复制代码 代码如下:

?mod=logging&action=login&loginsubmit=yes&floatlogin=yes&inajax=1


数据提交到了 member.php 文件中,在程序中可看到下面的代码:

$mod = !in_array($discuz->var['mod'], $modarray) ? 'logging' : $discuz->var['mod']; //mod的值即是接下来加载的php页面 define('CURMODULE', $mod); $modcachelist = array('register' => array('modreasons', 'stamptypeid', 'fields_required', 'fields_optional', 'ipctrl')); $cachelist = array(); if(isset($modcachelist[CURMODULE])) { $cachelist = $modcachelist[CURMODULE]; } $discuz->cachelist = $cachelist; $discuz->init(); runhooks(); require DISCUZ_ROOT.'./source/module/member/member_'.$mod.'.php'; //完成程序的包含操作

打开source/module/member/member_logging.php文件,是一个类,在类的前面可看到下面三句代码:

$ctl_obj = new logging_ctl(); $method = 'on_'.$_G['gp_action']; // $_G['gp_action'] 等于action的值即 login $ctl_obj->$method(); //$ctl_obj->on_login();

在类中可找到login方法,在方法中,大约 56 行有下面一个判断语句:

if(!submitcheck('loginsubmit', 1, $seccodecheck)) { //判断语句是当游客浏览时,submitcheck 函数的返回值是假,取反,为真。 //当用户登录时,程序走的是else部分,在里面可看到下面五句代码: } else { $_G['uid'] = $_G['member']['uid'] = 0; $_G['username'] = $_G['member']['username'] = $_G['member']['password'] = ''; //变量赋值 $result = userlogin($_G['gp_username'], $_G['gp_password'], $_G['gp_questionid'], $_G['gp_answer'], $_G['setting']['autoidselect'] ? 'auto' : $_G['gp_loginfield']); //从数据库查询用户数据,并返回相应的信息 if($result['status'] > 0) { //状态值大于 0 ,说明有此用户,可以登录 setloginstatus($result['member'], $_G['gp_cookietime'] ? 2592000 : 0); //设置登录状态,即是写 COOKIE 操作,COOKIE 中的数据即是 SESSION 中相应的数据,但此函数并不负责写 SESSION 的操作

我们来看一下 source/function/function_login.php中的 setloginstatus 函数,是普通的写 COOKIE 操作,不再具体讲解:

function setloginstatus($member, $cookietime) { global $_G; $_G['uid'] = $member['uid']; $_G['username'] = $member['username']; $_G['adminid'] = $member['adminid']; $_G['groupid'] = $member['groupid']; $_G['formhash'] = formhash(); $_G['session']['invisible'] = getuserprofile('invisible'); $_G['member'] = $member; $_G['core']->session->isnew = 1; dsetcookie('auth', authcode("{$member['password']}\t{$member['uid']}", 'ENCODE'), $cookietime, 1, true); //authcode加密 dsetcookie('loginuser'); dsetcookie('activationauth'); dsetcookie('pmnum'); }

到这里可以说是登录流程大部分已经走完,但是 COOKIE 不清除时,会一直存在于客户端,如果超时,程序中会在判断弃用此 COOKIE,并重新写入。

下面我们来看一下 DZX 中 SESSION 操作的类,在 source/class/calss_core.php 文件中:
程序中每次请求都会加载 SESSION ,这是由核心类 discuz_core 中的 _init_session 方法来执行的,此方法被置于 类的 init方法中,说明每次加载类,会自动将 SESSION 写入。

function _init_session() { $this->session = new discuz_session(); //创建 SESSION 类 if($this->init_session) { //从 COOKIE 中读取数据 $this->session->init($this->var['cookie']['sid'], $this->var['clientip'], $this->var['uid']); $this->var['sid'] = $this->session->sid; $this->var['session'] = $this->session->var; //判断 SID 是否相等,不等,说明是多个用户在同一主机上登录网站,需要重新写 COOKIE if($this->var['sid'] != $this->var['cookie']['sid']) { dsetcookie('sid', $this->var['sid'], 86400); } if($this->session->isnew) { if(ipbanned($this->var['clientip'])) { $this->session->set('groupid', 6); } } if($this->session->get('groupid') == 6) { $this->var['member']['groupid'] = 6; sysmessage('user_banned'); } //UID 不为空,且需要更新 SESSION 或是 SESSION 超时,更改用户状态,需要用户重新登录 if($this->var['uid'] && ($this->session->isnew || ($this->session->get('lastactivity') + 600) session->set('lastactivity', TIMESTAMP); $update = array('lastip' => $this->var['clientip'], 'lastactivity' => TIMESTAMP); if($this->session->isnew) { $update['lastvisit'] = TIMESTAMP; } DB::update('common_member_status', $update, "uid='".$this->var['uid']."'"); } } }

操作 SESSION 的类是 discuz_session ,我们看这个类里面的两个方法:

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 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. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

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

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

Discuz 백그라운드 로그인 문제 해결 방법 공개 Discuz 백그라운드 로그인 문제 해결 방법 공개 Mar 03, 2024 am 08:57 AM

Discuz 백그라운드 로그인 문제에 대한 해결책이 공개되었습니다. 인터넷의 급속한 발전으로 인해 웹 사이트 구축이 점점 보편화되고 있으며 일반적으로 사용되는 포럼 웹 사이트 구축 시스템으로 Discuz가 선호되고 있습니다. 많은 웹마스터. 그러나 강력한 기능으로 인해 Discuz를 사용할 때 백그라운드 로그인 문제와 같은 몇 가지 문제가 발생할 수 있습니다. 오늘은 Discuz 백그라운드 로그인 문제에 대한 해결책을 공개하고 구체적인 코드 예시를 제공하여 도움이 필요한 분들에게 도움이 되기를 바라겠습니다.

디스커스란 무엇인가요? Discuz의 정의 및 기능 소개 디스커스란 무엇인가요? Discuz의 정의 및 기능 소개 Mar 03, 2024 am 10:33 AM

"Discovering Discuz: 정의, 기능 및 코드 예제" 인터넷의 급속한 발전과 함께 커뮤니티 포럼은 사람들이 정보를 얻고 의견을 교환하는 중요한 플랫폼이 되었습니다. 많은 커뮤니티 포럼 시스템 중에서 중국의 잘 알려진 오픈 소스 포럼 소프트웨어인 Discuz는 대다수의 웹 사이트 개발자 및 관리자가 선호합니다. 그렇다면 Discuz는 무엇입니까? 어떤 기능이 있으며 웹사이트에 어떻게 도움이 됩니까? 이 기사에서는 Discuz를 자세히 소개하고 독자가 이에 대해 더 자세히 알아볼 수 있도록 구체적인 코드 예제를 첨부합니다.

Discuz 사용자의 필수품! 소품명칭 종합분석! Discuz 사용자의 필수품! 소품명칭 종합분석! Mar 12, 2024 pm 10:15 PM

Discuz 사용자의 필수품! 소품명칭 종합분석! Discuz 포럼에서 이름 변경 기능은 항상 사용자들로부터 많은 관심과 요구를 받아왔습니다. 이름을 변경해야 하는 일부 사용자의 경우 이름 변경 소품을 사용하면 사용자 이름을 쉽게 수정할 수 있으며 이는 흥미로운 상호 작용 방법이기도 합니다. Discuz의 이름 바꾸기 소품을 얻는 방법, 사용 방법, 몇 가지 일반적인 문제에 대한 해결 방법을 포함하여 심층적으로 살펴보겠습니다. 1. 개명 소품은 Discuz에서 구입하세요. 개명 소품은 주로 포인트나 관리자를 통해 구매합니다.

잘못된 Discuz 비밀번호를 발견하면 어떻게 해야 합니까? 빠른 솔루션 공유! 잘못된 Discuz 비밀번호를 발견하면 어떻게 해야 합니까? 빠른 솔루션 공유! Mar 03, 2024 am 09:33 AM

잘못된 Discuz 비밀번호를 발견하면 어떻게 해야 합니까? 빠른 솔루션 공유! 토론하세요! 사용자에게 편리한 커뮤니케이션 플랫폼을 제공하는 매우 인기 있는 포럼 프로그램입니다. 디스커스를 이용해보세요! 포럼에 입장할 때, 때때로 잘못된 비밀번호를 접할 수 있으며, 이로 인해 사용자가 포럼에 정상적으로 로그인하고 이용하지 못할 수 있습니다. 자, Discuz를 만나보세요! 비밀번호가 틀리면 어떻게 신속하게 문제를 해결해야 합니까? 일부 솔루션은 참조용으로 제공된 특정 코드 예제와 함께 아래에서 공유됩니다. 1. 비밀번호가 맞는지 확인하세요

Discuz 백그라운드 로그인에 실패했나요? 쉽게 해결하는 방법을 가르쳐주세요! Discuz 백그라운드 로그인에 실패했나요? 쉽게 해결하는 방법을 가르쳐주세요! Mar 02, 2024 pm 06:03 PM

Discuz 백그라운드 로그인에 실패했나요? 쉽게 해결하는 방법을 가르쳐주세요! 인기 포럼 플랫폼인 Discuz는 웹 사이트 구축 및 관리에 널리 사용되기 때문에 때때로 백엔드 로그인 실패가 발생하여 사람들이 고민하는 경우가 있습니다. 오늘은 Discuz 백엔드 로그인 실패를 일으킬 수 있는 문제에 대해 논의하고 몇 가지 솔루션과 구체적인 코드 예제를 제공하겠습니다. 이 기사가 비슷한 문제를 겪고 있는 웹마스터와 개발자에게 도움이 되기를 바랍니다. 1. 문제 해결은 Discuz 백그라운드 로그인 실패 문제를 해결하는 것입니다.

Discuz 등록 절차에 대한 자세한 설명: 개인 정보를 쉽게 수정할 수 있습니다. Discuz 등록 절차에 대한 자세한 설명: 개인 정보를 쉽게 수정할 수 있습니다. Mar 13, 2024 pm 12:21 PM

"Discus 등록 프로세스에 대한 자세한 설명: 개인 정보를 쉽게 수정할 수 있도록 하기 위해 구체적인 코드 예제가 필요합니다." Discuz는 다양한 웹 사이트에서 널리 사용되는 강력한 커뮤니티 포럼 프로그램으로, 풍부한 사용자 등록 및 개인 정보 수정 기능을 제공합니다. 그리고 인터페이스. 이 글에서는 Discuz의 등록 프로세스를 자세히 소개하고, 개인 정보를 쉽게 사용자 정의하고 수정할 수 있도록 구체적인 코드 예제를 제공합니다. 1. 사용자 등록 과정 Discuz에서 사용자 등록은 등록 과정의 원활한 진행과 사이트의 중요한 기능 중 하나입니다.

Discuz WeChat 공유가 표시되지 않는 문제 해결 Discuz WeChat 공유가 표시되지 않는 문제 해결 Mar 09, 2024 pm 03:39 PM

제목: Discuz WeChat 공유가 표시되지 않는 문제를 해결하려면 구체적인 코드 예제가 필요합니다. 모바일 인터넷의 발전으로 WeChat은 사람들의 일상생활에 없어서는 안될 부분이 되었습니다. 웹사이트 개발 시 사용자 경험을 개선하고 웹사이트 노출을 확대하기 위해 많은 웹사이트에 WeChat 공유 기능이 통합되어 사용자가 웹사이트 콘텐츠를 Moments 또는 WeChat 그룹에 쉽게 공유할 수 있습니다. 그러나 때때로 Discuz와 같은 오픈 소스 포럼 시스템을 사용할 때 WeChat 공유를 표시할 수 없는 문제가 발생하여 사용자 경험에 특정 어려움을 초래할 수 있습니다.

Discuz 도메인 이름 수정 단계에 대한 자세한 설명 Discuz 도메인 이름 수정 단계에 대한 자세한 설명 Mar 11, 2024 am 11:00 AM

Discuz 도메인 이름을 수정하는 단계에 대한 자세한 설명이 필요합니다. 웹사이트 개발 및 운영에 따라 브랜드 변경, 웹사이트 SEO로 인해 때때로 Discuz 도메인 이름을 수정해야 할 수 있습니다. 최적화 또는 기타 이유. 이유가 무엇이든 Discuz 도메인 이름을 변경하는 것은 신중한 작업이 필요한 과정입니다. 오늘은 Discuz 도메인 이름을 변경하는 단계를 자세히 소개하고 구체적인 코드 예제를 제공하겠습니다. 1단계: 데이터를 백업하세요. 도메인 이름을 수정하기 전에 먼저 웹사이트가 올바른지 확인해야 합니다.

See all articles