仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1119|回复: 19
打印 上一主题 下一主题

[学习教程] PHP网页设计PHP 完成多办事器同享 SESSION 数据

[复制链接]
柔情似水 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:13:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我假设你目前已经可以完成一个静态页面了,当然,做的好看难看是另外一说,皮皮我的第一个网页也没好看到哪去,但是“孩子”再丑,咱们做“爹妈”的也不能嫌弃不是?这毕竟是咱的成果。session|办事器|数据   1、成绩发源
稍大一些的网站,凡是城市有好几个办事器,每一个办事器运转着分歧功效的模块,利用分歧的二级域名,而一个全体性强的网站,用户体系是一致的,即一套用户名、暗码在全部网站的各个模块中都是可以登录利用的。各个办事器同享用户数据是对照轻易完成的,只需求在后端放个数据库办事器,各个办事器经由过程一致接口对用户数据停止会见便可。但还存在一个成绩,就是用户在这个办事器登录以后,进入另外一个办事器的其余模块时,依然需求从头登录,这就是一次登录,全体通行的成绩,映照到手艺上,其实就是各个办事器之间若何完成同享 SESSION 数据的成绩。

2、PHP SESSION 的任务道理
在处理成绩之前,先来懂得一下 PHP SESSION 的任务道理。在客户端(如阅读器)登录网站时,被会见的 PHP 页面可使用 session_start() 翻开 SESSION,如许就会发生客户真个独一标识 SESSION ID(此 ID 可经由过程函数 session_id() 获得/设置)。SESSION ID 可以经由过程两种体例保存在客户端,使得恳求分歧的页面时,PHP 法式可以获知客户真个 SESSION ID;一种是将 SESSION ID 主动到场到 GET 的 URL 中,或 POST 的表单中,默许情形下,变量名为 PHPSESSID;另外一种是经由过程 COOKIE,将 SESSION ID 保留在 COOKIE 中,默许情形下,这个 COOKIE 的名字为 PHPSESSID。这里咱们次要以 COOKIE 体例停止申明,由于使用对照普遍。
那末 SESSION 的数据保留在哪里呢?固然是在办事器端,但不是保留在内存中,而是保留在文件或数据库中。默许情形下,php.ini 中设置的 SESSION 保留体例是 files(session.save_handler = files),即便用读写文件的体例保留 SESSION 数据,而 SESSION 文件保留的目次由 session.save_path 指定,文件名以 sess_ 为前缀,后跟 SESSION ID,如:sess_c72665af28a8b14c0fe11afe3b59b51b。文件中的数据便是序列化以后的 SESSION 数据了。假如会见量大,能够发生的 SESSION 文件会对照多,这时候可以设置分级目次停止 SESSION 文件的保留,效力会进步良多,设置办法为:session.save_path="N;/save_path",N 为分级的级数,save_path 为入手下手目次。当写入 SESSION 数据的时分,PHP 会获得到客户真个 SESSION_ID,然后依据这个 SESSION ID 到指定的 SESSION 文件保留目次中找到响应的 SESSION 文件,不存在则创立之,最初将数据序列化以后写入文件。读取 SESSION 数据是也是相似的操作流程,对读出来的数据需求停止解序列化,生成响应的 SESSION 变量。

3、多办事器同享 SESSION 的次要妨碍及处理举措
经由过程懂得 SESSION 的任务道理,咱们可以发明,在默许情形下,各个办事器会各自分离对同
一个客户端发生 SESSION ID,如关于统一个用户阅读器,A 办事器发生的 SESSION ID 是 30de1e9de3192ba6ce2992d27a1b6a0a,而 B 办事器生成的则是 c72665af28a8b14c0fe11afe3b59b51b。别的,PHP 的 SESSION 数据都是分离保留在
本办事器的文件体系中。以下图所示:



                               
登录/注册后可看大图

肯定了成绩地点以后,就能够着手停止处理了。想要同享 SESSION 数据,那就必需完成两个方针:一个是各个办事器对统一个客户端发生的 SESSION ID 必需不异,而且可经由过程统一个 COOKIE 停止传递,也就是说各个办事器必需可以读取统一个名为 PHPSESSID 的 COOKIE;
另外一个是 SESSION 数据的存储体例/地位必需包管各个办事器都可以会见到。复杂地说就是多办事器同享客户真个 SESSION ID,同时还必需同享办事器真个 SESSION 数据。

第一个方针的完成其实很复杂,只需求对 COOKIE 的域(domain)停止特别地设置便可,
默许情形下,COOKIE 的域是以后办事器的域名/IP 地址,而域分歧的话,各个办事器所设
置的 COOKIE 是不克不及互相会见的,如

                               
登录/注册后可看大图

4、代码完成
起首创立数据表,MySQL 的 SQL 语句以下:
CREATE TABLE `sess` (
`sesskey` varchar(32) NOT NULL default "",
`expiry` bigint(20) NOT NULL default "0",
`data` longtext NOT NULL,
PRIMARY KEY (`sesskey`),
KEY `expiry` (`expiry`)
) TYPE=MyISAM
sesskey 为 SESSION ID,expiry 为 SESSION 过时工夫,data 用于保留 SESSION 数据。
默许情形下 SESSION 数据是以文件体例保留,想要利用数据库体例保留,就必需从头界说 SESSION 各个操作的处置函数。PHP 供应了session_set_save_handle() 函数,可以用此函数自界说 SESSION 的处置进程,固然起首要先将 session.save_handler 改成 user,可在 PHP 中停止设置:
session_module_name("user");
接上去侧重讲一下 session_set_save_handle() 函数,
此函数有六个参数:
session_set_save_handler ( string open, string close, string read, string write, string destroy, string gc )各个参数为各项操作的函数名,这些操作顺次是:翻开、封闭、读取、写入、烧毁、渣滓收受接管。PHP 手册中有具体的例子,
在这里咱们利用 OO 的体例来完成这些操作,具体代码以下:
代码:[size=+0]<?php
define("MY_SESS_TIME", 3600);
//SESSION 保存时长
//类界说
class My_Sess
{
function init()
{
$domain = ".infor96.com";
//不利用 GET/POST 变量体例
ini_set("session.use_trans_sid",0);
//设置渣滓收受接管最大保存工夫
ini_set("session.gc_maxlifetime",MY_SESS_TIME);
//利用 COOKIE 保留 SESSION ID 的体例
ini_set("session.use_cookies",1);
ini_set("session.cookie_path","/");
//多主机同享保留 SESSION ID 的 COOKIE
ini_set("session.cookie_domain", $domain);

//将 session.save_handler 设置为 user,
//而不是默许的 files
session_module_name("user");
//界说 SESSION 各项操作所对应的办法名:
session_set_save_handler(
array("My_Sess", "open"),
//对应于静态办法 My_Sess::open(),下同。
array("My_Sess", "close"),
array("My_Sess", "read"),
array("My_Sess", "write"),
array("My_Sess", "destroy"),
array("My_Sess", "gc")
);
} //end function

function open($save_path, $session_name) {
return true;
} //end function

function close() {
global $MY_SESS_CONN;

if ($MY_SESS_CONN) {
//封闭数据库毗连
$MY_SESS_CONN->Close();
}
return true;
} //end function

function read($sesskey) {
global $MY_SESS_CONN;

$sql = "SELECT data FROM sess WHERE sesskey=".$MY_SESS_CONN->qstr($sesskey)." AND expiry>=".time();
$rs =& $MY_SESS_CONN->Execute($sql);
if ($rs) {
if ($rs->EOF) {
return "";
} else {
//读取到对应于 SESSION ID 的 SESSION 数据
$v = $rs->fields[0];
$rs->Close();
return $v;
} //end if
} //end if
return "";
} //end function

function write($sesskey, $data) {
global $MY_SESS_CONN;

$qkey = $MY_SESS_CONN->qstr($sesskey);
$expiry = time() + My_SESS_TIME;
//设置过时工夫

//写入 SESSION
$arr = array(
"sesskey" => $qkey,
"expiry" => $expiry,
"data" => $data);
$MY_SESS_CONN->WordStr("sess", $arr, "sesskey", $autoQuote = true);
return true;
} //end function

function destroy($sesskey) {
global $MY_SESS_CONN;

$sql = "DELETE FROM sess WHERE sesskey=".$MY_SESS_CONN->qstr($sesskey);
$rs =& $MY_SESS_CONN->Execute($sql);
return true;
} //end function

function gc($maxlifetime = null) {
global $MY_SESS_CONN;

$sql = "DELETE FROM sess WHERE expiry<".time();
$MY_SESS_CONN->Execute($sql);
//因为常常性的对表 sess 做删除操作,轻易发生碎片,
//所以在渣滓收受接管中对该表停止优化操作。
$sql = "OPTIMIZE TABLE sess";
$MY_SESS_CONN->Execute($sql);
return true;
} //end function
} ///:~

//利用 ADOdb 作为数据库笼统层。
require_once("adodb/adodb.inc.php");
//数据库设置装备摆设项,可放入设置装备摆设文件中(如:config.inc.php)。
$db_type = "mysql";
$db_host = "192.168.212.1";
$db_user = "sess_user";
$db_pass = "sess_pass";
$db_name = "sess_db";
//创立数据库毗连,这是一个全局变量。
$GLOBALS["MY_SESS_CONN"] =& ADONewConnection($db_type);
$GLOBALS["MY_SESS_CONN"]->Connect( $db_host, $db_user, $db_pass, $db_name);
//初始化 SESSION 设置,必需在 session_start() 之前运转!!
My_Sess::init();
?>

5、遗留成绩
假如网站的会见量很大的话,SESSION 的读写会频仍地对数据库停止操作,如许效力就会分明下降。思索到 SESSION 数据普通不会很大,可以测验考试用 C/Java 写个多线程的法式,用 HASH 表保留 SESSION 数据,并经由过程 socket 通讯停止数据读写,如许 SESSION 就保留在内存中,读写速度应当会快良多。别的还可以经由过程负载平衡来分管办事器负载。不外这些都只是我本人的一些设法和假定,并没有理论过 :(
从刚开始练习的PHP基础语法练习,到PHP语言在WEB中的应用,再到实际的项目开发,如留言版,相册系统,中小型公司网站系统,以及期间做过的有关团队合作的小游戏,让我受益匪浅,学到了很多。
海妖 该用户已被删除
沙发
发表于 2015-2-4 10:02:43 | 只看该作者
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
柔情似水 该用户已被删除
板凳
 楼主| 发表于 2015-2-9 22:02:38 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
admin 该用户已被删除
地板
发表于 2015-2-12 10:07:41 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
若相依 该用户已被删除
5#
发表于 2015-2-18 02:50:27 | 只看该作者
做为1门年轻的语言,php一直很努力。
若天明 该用户已被删除
6#
发表于 2015-2-21 09:39:32 | 只看该作者
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
深爱那片海 该用户已被删除
7#
发表于 2015-3-6 20:04:36 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
因胸联盟 该用户已被删除
8#
发表于 2015-3-9 21:43:03 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
小女巫 该用户已被删除
9#
发表于 2015-3-17 01:26:48 | 只看该作者
兴趣是最好的老师,百度是最好的词典。
飘飘悠悠 该用户已被删除
10#
发表于 2015-3-17 20:55:13 | 只看该作者
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
再见西城 该用户已被删除
11#
发表于 2015-3-20 04:30:48 | 只看该作者
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
小魔女 该用户已被删除
12#
发表于 2015-4-6 04:58:58 | 只看该作者
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
透明 该用户已被删除
13#
发表于 2015-4-11 10:19:56 | 只看该作者
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
14#
发表于 2015-4-13 21:30:55 | 只看该作者
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
简单生活 该用户已被删除
15#
发表于 2015-4-16 16:09:09 | 只看该作者
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
再现理想 该用户已被删除
16#
发表于 2015-4-18 14:29:23 | 只看该作者
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
老尸 该用户已被删除
17#
发表于 2015-5-10 18:30:42 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
变相怪杰 该用户已被删除
18#
发表于 2015-5-11 22:58:53 | 只看该作者
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
冷月葬花魂 该用户已被删除
19#
发表于 2015-6-13 20:49:31 | 只看该作者
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
兰色精灵 该用户已被删除
20#
发表于 2015-6-20 03:11:01 | 只看该作者
当然这种网站的会员费就几十块钱。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-13 13:00

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表