61阅读

php session-PHP 与 NodeJS 如何共用 Session?

发布时间:2018-02-07 所属栏目:编程开发

一 : PHP 与 NodeJS 如何共用 Session?


网友Dion[php session]PHP 与 NodeJS 如何共用 Session?给出的答复:
可以使用第三方的缓存工具,比如 memcached。
参考这篇文章:PHP and Node.JS session share using memcache


网友蒙面大侠[php session]PHP 与 NodeJS 如何共用 Session?给出的答复:
没有问题描述,也不知道你都尝试过哪些方法,只能假设你的场景是“node如何读取php session”,这应该是最常见的情况。

PHP暴露一个Service,向Node提供Session数据

php_session.php?SID=xxxx<?php function getSessionByID($SID) { if (session_id()) { // 关闭当前session session_destroy(); } // 初始化指定session session_id($SID); session_start(); // 返回操作接口更友好的JSON // 必要的FLAG看这里 http://www.61k.commanual/en/json.constants.php return json_encode($_SESSION); } header('Content-Type:application/json'); echo getSessionByID($_GET['SID']); ?>nodevar request = require('request');request('http://localhost/php_session.php?SID=xxxx', function(err, res, body) { if (!err && res.statusCode == 200) { // 根据需要使用body(json) }});


网友伍壕[php session]PHP 与 NodeJS 如何共用 Session?给出的答复:
session还是放在服务器端操作比较好。
可以选择使用cookie,将cookie的生存时间expire设置为0代表随浏览器关闭失效。生存效果和session差不多,前端操作就方便很多了。
note.js运行在服务端的啊?和php并行运行的话可以考虑第三方共享session了,memcache,redis,数据库也可以。


网友蒙面大侠[php session]PHP 与 NodeJS 如何共用 Session?给出的答复:
说白了,什么叫共用?就是同一条数据,PHP能读,Node.js也能读。
至于怎么读就得看自己了,放数据库、Memcache、甚至你直接通过PHP留接口给Node.js(就像flamingtop提供的方法)。


网友蒙面大侠[php session]PHP 与 NodeJS 如何共用 Session?给出的答复:
使用一个第三方存储如redis来保存session。


网友Yorkie[php session]PHP 与 NodeJS 如何共用 Session?给出的答复:
session的目的是把数据存在服务器的内存里,如果清楚这点,那么找一个内存数据库(redis,memcached...)就能达到你的目的,如果你嫌这些都还太重量级,就随便用一个你熟悉的语言写一个轻量级的内存数据库就好,跨语言接口或者说是进程间通信推荐使用.sock文件。


网友蒙面大侠[php session]PHP 与 NodeJS 如何共用 Session?给出的答复:
建议是使用redis 或者memcached 做 session,这样不仅node和php程序可以共享session,也不会对php、node程序造成额外的开销。

如果是session放在node或者php程序的内存中,一来需要额外的代码和资源维护,二来这些代码往往不及redis等k-v数据库的解决方案成熟,反而(如果不合理的代码的话)是容易引起bug或者性能瓶颈的地方。比如上面有人提及的暴露php service的方法,或者是暴露node service,不说编写、维护代码需要人力开销,线上每秒请求处理能力一般是 php <~ node <<redis ~ memcached<<in memory, 比如在某机子上 1k(php)8k(nodejs),相比较redis 2W+的能力和成熟的 php-memcached 和 node-redis插件,我并不觉得这种方式有多少优势。


网友无喱头[php session]PHP 与 NodeJS 如何共用 Session?给出的答复:
推荐redis,php可以直接配置session方案,nodejs也有很多lib


网友南郭子綦[php session]PHP 与 NodeJS 如何共用 Session?给出的答复:
一般的做法是使用session服务器,使用mysql或者memcache等成熟的方案都是可行的。


网友OTHER[php session]PHP 与 NodeJS 如何共用 Session?给出的答复:
用radis+memcache来维护session表,做个decay机制。


网友longan li[php session]PHP 与 NodeJS 如何共用 Session?给出的答复:
缓存+cookie吧。早都有人说过分布式用session你会疯掉


网友王海[php session]PHP 与 NodeJS 如何共用 Session?给出的答复:
从架构角度来讲:有服务器资源的nosql 没服务器资源的mysql内存表,不建议直接存服务器了,因为这样把session作为了PHP的子模块 而不是和php nodejs同级的模块
从业务角度:看程序员的心情吧


网友代哥[php session]PHP 与 NodeJS 如何共用 Session?给出的答复:
不要搞得那么复杂了,不同的语言要共享session,使用共享session存储就可以了。
比如可以将session保存到mysql, memcache中,都是不错的方案的。


网友朝沐金风[php session]PHP 与 NodeJS 如何共用 Session?给出的答复:
用session_save_handler自己保存成json比较容易交互,也可以用我早前写的一个node扩展:bombworm/node-serializer 路 GitHub
限制是stdClass的数据无法还原


网友相相生[php session]PHP 与 NodeJS 如何共用 Session?给出的答复:
走内存 比如memcache


网友西瓜IN[php session]PHP 与 NodeJS 如何共用 Session?给出的答复:
第三方mm


网友Shawn[php session]PHP 与 NodeJS 如何共用 Session?给出的答复:
如果是web应用, nodejs在生产环境都是多进程运行, 所以session存储必然是进程外的, 我之前用过redis.

至于php, 我没了解过, 如果要支持多机, 水平扩展, 类似redis的方案还是需要的

这种方案缺点就是只能保存通用数据, 不能保存对象引用什么的.

二 : php里session的用法

php里session的用法(超级经典)

php中session的用法

PHP中的session默认情况下是使用客户端的Cookie。当客户端的Cookie被禁用时,会自动通过Query_String来传递。

Php处理会话的函数一共有11个,我们详细介绍一下将要用到几个函数。

1、 session_start

函数功能:开始一个会话或者返回已经存在的会话。

函数原型:boolean session_start(void);

返回值:布尔值

功能说明:这个函数没有参数,且返回值均为true。最好将这个函数置于最先,而且在它之前不能有任何输出,否则会报警,如:Warning: Cannot send session cache limiter - headers already sent (output started at

/usr/local/apache/htdocs/cga/member/1.php:2) in

/usr/local/apache/htdocs/cga/member/1.php on line 3

2、 session_register

函数功能:登记一个新的变量为会话变量

函数原型:boolean session_register(string name);

返回值:布尔值。

功能说明:这个函数是在全局变量中增加一个变量到当前的SESSION中,参数name就是想要加入的变量名,成功则返回逻辑值true。可以用$_SESSION[name]或$HTTP_SESSION_VARS[name]的形式来取值或赋值。

3、 session_is_registered

函数功能:检查变量是否被登记为会话变量。

函数原型:boobean session_is_registered(string name);

返回值:布尔值

功能说明:这个函数可检查当前的session之中是否已有指定的变量注册,参数name就是要检查的变量名。成功则返回逻辑值true。

4、 session_unregister

函数功能:删除已注册的变量。

函数原型:boolean session_session_unregister(string name);

返回值:布尔值

功能说明:这个函数在当前的session之中删除全局变量中的变量。参数name就是欲删除的变量名,成功则返回true.

5、 Session_destroy

函数功能:结束当前的会话,并清空会话中的所有资源。

函数原型:boolean session destroy(void);

返回值:布尔值。

功能说明:这个函数结束当前的session,此函数没有参数,且返回值均为true 上面介绍函数下文将会用到,但还有一些有关session的函数也介绍一下:

6、 session_encode

函数功能:sesssion信息编码

函数原型:string session_encode(void);

返回值:字符串

功能说明:返回的字符串中包含全局变量中各变量的名称与值,形式如:a|s:12:"it is a test";c|s:4:"lala"; a是变量名 s:12代表变量a的值"it is a test的长度是12 变量间用分号”;”分隔。

7、 session_decode

函数功能:sesssion信息解码

函数原型:boolean session_decode (string data)

返回值:布尔值

功能说明:这个函数可将session信息解码,成功则返回逻辑值true

8、 session_name

函数功能:存取当前会话名称

函数原型:boolean session_name(string [name]);

返回值:字符串

功能说明:这个函数可取得或重新设置当前session的名称。若无参数name则表示获取当前session名称,加上参数则表示将session名称设为参数name

9、 session_id

函数功能:存取当前会话标识号

函数原型:boolean session_id(string [id]);

返回值:字符串

功能说明:这个函数可取得或重新设置当前存放session的标识号。若无参数id则表示只获取当前session的标识号,加上参数则表示将session的标识号设成新指定的id

10、 session_unset

函数功能:删除所有已注册的变量。

函数原型:void session_unset (void)

返回值:布尔值

功能说明:这个函数和Session_destroy不同,它不结束会话。就如同用函数session_unregister逐一注销掉所有的会话变量。

编程思路

在社区、论坛中,我们常能看到当前在线的会员,使访问者有宾至如归之感。但这种程序是怎么做出来的呢?

流程如下:

建表user,保存注册用户信息。 字段

类型

备注

userid

Int(10)

用户序列号 auto_increment 关键字 username

Varchar(50)

用户匿称

userpwd

Varchar(50)

密码

email

Varchar(50)

电子信箱

oicq

Varchar(50)

OICQ号

signature

mediumtext

签名

imgurl

Varchar(50)

头像

joindate

Varchar(50)

加入时间

建类文件user.php 定义函数

exist($username)确认新注册用户是不是已经存在

nsert($username,$userpwd,$email,$oicq,$imgurl,$signature)插入注册用户

update($userid,$username,$userpwd,$email,$oicq,$imgurl,$signature) 更新用户数据

get_from_condition($con) 返回满足查询条件的记录集

建表session。当用户登录时即向此表插入新记录,离开或超时后删除记录,保证表中保存的是当前在线的用户。

字段

类型

备注

sessionid

Int(10)

序列号 auto_increment 关键字

userid

Int(10)

用户序列号取自user表

ipaddress

Varchar(50)

Ip地址

lastactivity

Int(10)

最后活动时间,用它来判断用户是否还在线

建类文件session.php 定义函数

insert($userid,$ipaddress,$lastactivity) 把登录成功的用户插入到表中 update($userid,$ipaddress,$lastactivity)更新在线用户最后活动时间

del($con)删除满足条件的用户,用它来清除离线用户

get_from_condition($con) 返回满足查询条件的记录集

公用文件global.php

include "class/config.inc.php"; //把配置文件包含进来

$db = new db;

$db-> db_connect( ); //连接数据库

$user = new user; //初始化

$session = new session;

//启动会话

session_start();

//删除session表中已经过期的用户(即非在线网友)因为此文件总是被调用从而保证显示的都是当前在线的用户

$curtime=time();

$con="lastactivity<$curtime";

$session->del($con);

//正在线的网友需不断更新session表中的lastactivity时间,并重新设置用户的COOKIES

if ($HTTP_SESSION_VARS["online"]=="on"){ //此处也可用$_SESSION[“online”] $userid=$HTTP_SESSION_VARS["userid"]; //取当前在线用户的userid $ipaddress=substr($REMOTE_ADDR,0,50);

$lastactivity=time()+3600; //更新最后活动时间,如时一个小时之内未调动页面就认

为用户已离线,从而会被删除。

$session->update($userid,$ipaddress,$lastactivity);

}else{

//如果未登录那直接转入登录页面

$firstpage="logon.php";

header ("Location: $firstpage");

exit;

}

登录文件logon.php

if ($hiddenField=="0"){ //测检表单有未被提交

$con="username='$username' and userpwd='$userpwd'";

$result=$user->get_from_condition($con);

if ($user->counter==1){

if (!session_is_registered("online")){//检测是否被登记过

session_register("online"); //登记一个新的变量为会话变量

}

if (!session_is_registered("ccauser")){

session_register("ccauser");

}

if (!session_is_registered("userid")){

session_register("userid");

}

$ccauser=$username; //给会话变量赋值

$online="on"; //这个变量在global.php用到以更新最后活动时间lastactivity $userid=$user->userid;

$ipaddress=substr($REMOTE_ADDR,0,50);

$lastactivity=time()+3600;

$con=" userid=$userid";

$session->get_from_condition($con);

//判断会话是否存在,有可能你在不同的机器上登两次。

if ($session->counter==1){

$session->update($userid,$ipaddress,$lastactivity); //如存在,更新

}else{

$session->insert($userid,$ipaddress,$lastactivity); //如不存在,插入 }

//在客户机设置COOKIES

SetCookie("ccauser",$username,time()+3600);

Header("Location:test.php");//然后导向测试页

}

}

?>

if($HTTP_SESSION_VARS["online"]=="") { //判断是否已登录

?>

//下面是登录的表单

名称:

密码:

}else{

echo "网友:".$HTTP_COOKIE_VARS["ccauser"]."你已经登录了"; //如果已登录则显示提示

$str="

[url=exit.php]退出社区[/url]";

echo $str;

}

?>

测试文件test.php

include "global.php"; //把global.php文件包含进来

$strWelcome="欢迎[color=red]".$_SESSION['ccauser']."[/color] ";

echo $strWelcome; //显示欢迎信息

$str=” 当前在线用户:

===================

”;

$con=" 1=1";

//提出session表中所有记录即是当前在线用户,未把游客算在内 $result=$session->get_from_condition($con);

while($row=mysql_fetch_array($result)){

$con1="userid=$row[userid]";

$user->get_from_condition($con1);

$str.=$user->username." ";

}

echo $str;

?>

[url=exit.php]退出社区[/url]

退出文件exit.php

include "global.php"; //把global.php文件包含进来

if ($_SESSION["online"]=="on"){

$con="userid=$userid";

$session->del($con); //在session表中删除用户信息。

session_destroy(); //结束当前的会话,并清空会话中的所有资源 echo "已经退出社区......";

}

?>

本文来自CSDN博客,转载请标明出处:

http://blog.csdn.net/sayigood/archive/2009/11/22/4850480.aspx

三 : 彻底理解PHP的SESSION机制

一、默认机制,用磁盘文件来实现PHP会话。[www.61k.com)php.ini配置:session.save_handler = files
1、session_start()
A、 session_start()是session机制的开始,它有一定概率开启垃圾回收,因为session是存放在文件中,
PHP自身的垃圾回收是无效的,SESSION的回收是要删文件的,这个概率是根据php.ini的配置决定的,
但是有的系统是 session.gc_probability =0,这也就是说概率是0,而是通过cron脚本来实现垃圾回收。

           session.gc_probability =1
           session.gc_divisor =1000
           session.gc_maxlifetime =1440//过期时间 默认24分钟
           //概率是 session.gc_probability/session.gc_divisor 结果 1/1000,
           //不建议设置过小,因为session的垃圾回收,是需要检查每个文件是否过期的。
           session.save_path =//好像不同的系统默认不一样,有一种设置是 "N;/path"
           //这是随机分级存储,这个样的话,垃圾回收将不起作用,需要自己写脚本

B、 session会判断当前是否有$_COOKIE[session_name()];session_name()返回保存session_id的COOKIE键值,
这个值可以从php.ini找到

           session.name = PHPSESSID //默认值PHPSESSID
            

C、 如果不存在会生成一个session_id,然后把生成的session_id作为COOKIE的值传递到客户端.
相当于执行了下面COOKIE 操作,注意的是,这一步执行了setcookie()操作,COOKIE是在header头中发送的,
这之前是不能有输出的,PHP有另外一个函数 session_regenerate_id() 如果使用这个函数,这之前也是不能有输出的。

               setcookie(session_name(),
                         session_id(),
                         session.cookie_lifetime,//默认0
                         session.cookie_path,//默认'/'当前程序跟目录下都有效
                         session.cookie_domain,//默认为空
                         )

D、 如果存在那么session_id =$_COOKIE[session_name];
然后去session.save_path指定的文件夹里去找名字为'SESS_'.session_id()的文件.
读取文件的内容反序列化,然后放到$_SESSION中

2、 为$_SESSION赋值
比如新添加一个值$_SESSION['test'] ='blah'; 那么这个$_SESSION只会维护在内存中,当脚本执行结束的时候,
用把$_SESSION的值写入到session_id指定的文件夹中,然后关闭相关资源.     这个阶段有可能执行更改session_id的操作,
比如销毁一个旧的的session_id,生成一个全新的session_id.一半用在自定义 session操作,角色的转换上,
比如Drupal.Drupal的匿名用户有一个SESSION的,当它登录后需要换用新的session_id

       if (isset($_COOKIE[session_name()])) {
         setcookie(session_name(),'',time() -42000,'/');//旧session cookie过期
       }
       session_regenerate_id();//这一步会生成新的session_id
      //session_id()返回的是新的值

     3、 写入SESSION操作
在脚本结束的时候会执行SESSION写入操作,把$_SESSION中值写入到session_id命名的文件中,可能已经存在,
可能需要创建新的文件。

4、 销毁SESSION
SESSION发出去的COOKIE一般属于即时COOKIE,保存在内存中,当浏览器关闭后,才会过期,假如需要人为强制过期,
比如 退出登录,而不是关闭浏览器,那么就需要在代码里销毁SESSION,方法有很多,
         1. setcookie(session_name(),session_id(),time() -8000000,..);//退出登录前执行
         2. usset($_SESSION);//这会删除所有的$_SESSION数据,刷新后,有COOKIE传过来,但是没有数据。
         3. session_destroy();//这个作用更彻底,删除$_SESSION 删除session文件,和session_id

当不关闭浏览器的情况下,再次刷新,2和3都会有COOKIE传过来,但是找不到数据

二、由用户自定义session处理机制。php.ini配置:session.save_handler = user

     用户自定义session处理机制,更加直观
   *session_set_save_handler('open','close','read','write','destroy','gc');
1.session_start(),
     执行open($save_path,$session_name)打开session操作句柄
     $save_path 在session.save_handler = files的情况下它就是session.save_path,
但是如果用户自定的话,这个两个参数都用不上,直接返回TRUE

     执行read($id)从中读取数据.//这个参数是自动传递的就是session_id(),可以通过这个值进行操作。
   *2.脚本执行结束
     执行write($id,$sess_data) //两个参数,很简单
   *3.假如用户需要session_destroy()
     先执行destroy.在执行第2步

     一个实际例子:

     //SESSION初始化的时候调用
     function open($save_path,$session_name)
     {
       global$sess_save_path;
       $sess_save_path=$save_path;
       return(true);
     }

     //关闭的时候调用
     function close()
     {
       return(true);
     }

     function read($id)
     {
       global$sess_save_path;
       $sess_file="$sess_save_path/sess_$id";
       return (string) @file_get_contents($sess_file);
     }
     //脚本执行结束之前,执行写入操作
     function write($id,$sess_data)
     {
       echo"sdfsf";
       global$sess_save_path;

       $sess_file="$sess_save_path/sess_$id";
       if ($fp= @fopen($sess_file,"w")) {
         $return=fwrite($fp,$sess_data);
         fclose($fp);
         return$return;
       } else {
         return(false);
       }

     }

     function destroy($id)
     {
       global$sess_save_path;

       $sess_file="$sess_save_path/sess_$id";
       return(@unlink($sess_file));
     }

     function gc($maxlifetime)
     {
       global$sess_save_path;

       foreach (glob("$sess_save_path/sess_*") as$filename) {
         if (filemtime($filename) +$maxlifetime<time()) {
           @unlink($filename);
         }
       }
       returntrue;
     }

四 : php里session的用法

php里session的用法(超级经典)

php中session的用法

PHP中的session默认情况下是使用客户端的Cookie。[www.61k.com]当客户端的Cookie被禁用时,会自动通过Query_String来传递。

Php处理会话的函数一共有11个,我们详细介绍一下将要用到几个函数。

1、 session_start

函数功能:开始一个会话或者返回已经存在的会话。

函数原型:boolean session_start(void);

返回值:布尔值

功能说明:这个函数没有参数,且返回值均为true。最好将这个函数置于最先,而且在它之前不能有任何输出,否则会报警,如:Warning: Cannot send session cache limiter - headers already sent (output started at

/usr/local/apache/htdocs/cga/member/1.php:2) in

/usr/local/apache/htdocs/cga/member/1.php on line 3

2、 session_register

函数功能:登记一个新的变量为会话变量

函数原型:boolean session_register(string name);

返回值:布尔值。

功能说明:这个函数是在全局变量中增加一个变量到当前的SESSION中,参数name就是想要加入的变量名,成功则返回逻辑值true。可以用$_SESSION[name]或$HTTP_SESSION_VARS[name]的形式来取值或赋值。

3、 session_is_registered

函数功能:检查变量是否被登记为会话变量。

函数原型:boobean session_is_registered(string name);

phpsession php里session的用法

返回值:布尔值

功能说明:这个函数可检查当前的session之中是否已有指定的变量注册,参数name就是要检查的变量名。[www.61k.com]成功则返回逻辑值true。

4、 session_unregister

函数功能:删除已注册的变量。

函数原型:boolean session_session_unregister(string name);

返回值:布尔值

功能说明:这个函数在当前的session之中删除全局变量中的变量。参数name就是欲删除的变量名,成功则返回true.

5、 Session_destroy

函数功能:结束当前的会话,并清空会话中的所有资源。

函数原型:boolean session destroy(void);

返回值:布尔值。

功能说明:这个函数结束当前的session,此函数没有参数,且返回值均为true 上面介绍函数下文将会用到,但还有一些有关session的函数也介绍一下:

6、 session_encode

函数功能:sesssion信息编码

函数原型:string session_encode(void);

返回值:字符串

功能说明:返回的字符串中包含全局变量中各变量的名称与值,形式如:a|s:12:"it is a test";c|s:4:"lala"; a是变量名 s:12代表变量a的值"it is a test的长度是12 变量间用分号”;”分隔。

7、 session_decode

函数功能:sesssion信息解码

函数原型:boolean session_decode (string data)

phpsession php里session的用法

返回值:布尔值

功能说明:这个函数可将session信息解码,成功则返回逻辑值true

8、 session_name

函数功能:存取当前会话名称

函数原型:boolean session_name(string [name]);

返回值:字符串

功能说明:这个函数可取得或重新设置当前session的名称。[www.61k.com]若无参数name则表示获取当前session名称,加上参数则表示将session名称设为参数name

9、 session_id

函数功能:存取当前会话标识号

函数原型:boolean session_id(string [id]);

返回值:字符串

功能说明:这个函数可取得或重新设置当前存放session的标识号。若无参数id则表示只获取当前session的标识号,加上参数则表示将session的标识号设成新指定的id

10、 session_unset

函数功能:删除所有已注册的变量。

函数原型:void session_unset (void)

返回值:布尔值

功能说明:这个函数和Session_destroy不同,它不结束会话。就如同用函数session_unregister逐一注销掉所有的会话变量。

编程思路

在社区、论坛中,我们常能看到当前在线的会员,使访问者有宾至如归之感。但这种程序是怎么做出来的呢?

流程如下:

phpsession php里session的用法

建表user,保存注册用户信息。(www.61k.com) 字段

类型

备注

userid

Int(10)

用户序列号 auto_increment 关键字 username

Varchar(50)

用户匿称

userpwd

Varchar(50)

密码

email

Varchar(50)

电子信箱

oicq

Varchar(50)

OICQ号

signature

mediumtext

签名

imgurl

Varchar(50)

头像

phpsession php里session的用法

joindate

Varchar(50)

加入时间

建类文件user.php 定义函数

exist($username)确认新注册用户是不是已经存在

nsert($username,$userpwd,$email,$oicq,$imgurl,$signature)插入注册用户

update($userid,$username,$userpwd,$email,$oicq,$imgurl,$signature) 更新用户数据

get_from_condition($con) 返回满足查询条件的记录集

建表session。[www.61k.com]当用户登录时即向此表插入新记录,离开或超时后删除记录,保证表中保存的是当前在线的用户。

字段

类型

备注

sessionid

Int(10)

序列号 auto_increment 关键字

userid

Int(10)

用户序列号取自user表

ipaddress

Varchar(50)

Ip地址

lastactivity

Int(10)

phpsession php里session的用法

最后活动时间,用它来判断用户是否还在线

建类文件session.php 定义函数

insert($userid,$ipaddress,$lastactivity) 把登录成功的用户插入到表中 update($userid,$ipaddress,$lastactivity)更新在线用户最后活动时间

del($con)删除满足条件的用户,用它来清除离线用户

get_from_condition($con) 返回满足查询条件的记录集

公用文件global.php

include "class/config.inc.php"; //把配置文件包含进来

$db = new db;

$db-> db_connect( ); //连接数据库

$user = new user; //初始化

$session = new session;

//启动会话

session_start();

//删除session表中已经过期的用户(即非在线网友)因为此文件总是被调用从而保证显示的都是当前在线的用户

$curtime=time();

$con="lastactivity<$curtime";

$session->del($con);

//正在线的网友需不断更新session表中的lastactivity时间,并重新设置用户的COOKIES

if ($HTTP_SESSION_VARS["online"]=="on"){ //此处也可用$_SESSION[“online”] $userid=$HTTP_SESSION_VARS["userid"]; //取当前在线用户的userid $ipaddress=substr($REMOTE_ADDR,0,50);

$lastactivity=time()+3600; //更新最后活动时间,如时一个小时之内未调动页面就认

phpsession php里session的用法

为用户已离线,从而会被删除。(www.61k.com]

$session->update($userid,$ipaddress,$lastactivity);

}else{

//如果未登录那直接转入登录页面

$firstpage="logon.php";

header ("Location: $firstpage");

exit;

}

登录文件logon.php

if ($hiddenField=="0"){ //测检表单有未被提交

$con="username='$username' and userpwd='$userpwd'";

$result=$user->get_from_condition($con);

if ($user->counter==1){

if (!session_is_registered("online")){//检测是否被登记过

session_register("online"); //登记一个新的变量为会话变量

}

if (!session_is_registered("ccauser")){

session_register("ccauser");

}

if (!session_is_registered("userid")){

session_register("userid");

}

$ccauser=$username; //给会话变量赋值

$online="on"; //这个变量在global.php用到以更新最后活动时间lastactivity $userid=$user->userid;

phpsession php里session的用法

$ipaddress=substr($REMOTE_ADDR,0,50);

$lastactivity=time()+3600;

$con=" userid=$userid";

$session->get_from_condition($con);

//判断会话是否存在,有可能你在不同的机器上登两次。(www.61k.com)

if ($session->counter==1){

$session->update($userid,$ipaddress,$lastactivity); //如存在,更新

}else{

$session->insert($userid,$ipaddress,$lastactivity); //如不存在,插入 }

//在客户机设置COOKIES

SetCookie("ccauser",$username,time()+3600);

Header("Location:test.php");//然后导向测试页

}

}

?>

if($HTTP_SESSION_VARS["online"]=="") { //判断是否已登录

?>

//下面是登录的表单

名称:

密码:

}else{

echo "网友:".$HTTP_COOKIE_VARS["ccauser"]."你已经登录了"; //如果已登录则显示提示

$str="

phpsession php里session的用法

[url=exit.php]退出社区[/url]";

echo $str;

}

?>

测试文件test.php

include "global.php"; //把global.php文件包含进来

$strWelcome="欢迎[color=red]".$_SESSION['ccauser']."[/color] ";

echo $strWelcome; //显示欢迎信息

$str=” 当前在线用户:

===================

”;

$con=" 1=1";

//提出session表中所有记录即是当前在线用户,未把游客算在内 $result=$session->get_from_condition($con);

while($row=mysql_fetch_array($result)){

$con1="userid=$row[userid]";

$user->get_from_condition($con1);

$str.=$user->username." ";

}

echo $str;

?>

[url=exit.php]退出社区[/url]

退出文件exit.php

include "global.php"; //把global.php文件包含进来

phpsession php里session的用法

if ($_SESSION["online"]=="on"){

$con="userid=$userid";

$session->del($con); //在session表中删除用户信息。[www.61k.com]

session_destroy(); //结束当前的会话,并清空会话中的所有资源 echo "已经退出社区......";

}

?>

本文来自CSDN博客,转载请标明出处:

http://blog.csdn.net/sayigood/archive/2009/11/22/4850480.aspx

五 : php session的生存周期详解示例

首先说一下session的创建的开始到结束的过程。
当程序需要为某个客户端的请求创建一个 session 的时候,服务器首先会检查这个客户端是否已经包含了一个 session 标识,这个我们称为 session id(获取方法为 session_id() ),如果已包含一个 session id 则说明此客户端之前已经创建过 session,服务器则按照 session id 把这个 session 中的值检索出来,如果客户端不包含 session id,说明此客户端第一次请求服务器或手动清除过缓存文件,则为此客户端创建一个 session 并且生成一个与此 session 相关联的 session id,一般来说,session id 的值是不会重复的,并且加密的字符串,这个 session id 将被在本次响应中返回给客户端保存。
session 在何时被创建 ?
通常(是指通常)是在浏览器向服务器端第一次请求时被创建,并且它会占用一定的内存空间,因此在不必要的情况下,尽最关闭 session 。
session 何时被删除 ?
通常情况下,session 在会在这几种情况下被删除:
一是使用 session_destroy() 重置函数手动删除;
二是 session 的上次活动时间距离当前时间的间隔超过了 session 的超时设置的时间;三是服务器进程被停止。
怎么在浏览器关闭时删除 session ?
理论上来说,是做不到这一点,http是一种无状态协议,因此服务器不知道客户端什么时候关掉的浏览器,并且PHP也没有一个关相的函数来获取此项信息,但这个问题还可以得到解决,就是使用 网页特效 代码 window.oncolose 来监视浏览器的关闭动作,然后用Ajax向服务器端发送一个请求来删除 session ,但这个办法也并不会完全解决问题,原因是在有些情况下比如浏览器崩溃、突然断电、用户死机等这些时候并不能作出反应。
如何设置使session在一段时间过后自动失效(删除)?
session_start()是session机制的开始,它有一定概率开启垃圾回收,因为session是存放在文件中,PHP自身的垃圾回收是无效的,SESSION的回收(删除)是要删文件的,这个概率是根据php.ini的配置决定的,但是有的系统是 session.gc_probability = 0,这也就是说概率是0,而是通过cron脚本来实现垃圾回收(即删除session)。
PHP中的session有效期默认是1440秒(24分钟,注:php5里默认的是180分】,也就是说,客户端超过24分钟没有刷新,当前session就会失效。很明显,这是不能满足需要的。
一个已知管用的方法是,使用session_set_save_handler,接管所有的session管理工作,一般是把session信息存储到数据库,这样可以通过SQL语句来删除所有过期的session,精确地控制session的有效期。这也是基于PHP的大型网站常用的方法。但是,一般的小型网站,似乎没有必要这么劳师动众。
但是一般的Session的生命期有限,如果用户关闭了浏览器,就不能保存Session的变量了!那么怎么样可以实现Session的永久生命期呢?
大家知道,Session储存在服务器端,根据客户端提供的SessionID来得到这个用户的文件,然后读取文件,取得变量的值,SessionID可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录。
要实现Session的永久生命期,首先需要了解一下php.ini关于Session的相关设置(打开php.ini文件,在“[Session]”部分):

1、session.use_cookies:默认的值是“1”,代表SessionID使用Cookie来传递,反之就是使用Query_String来传递;
2、session.name:这个就是SessionID储存的变量名称,可能是Cookie,也可能是Query_String来传递,默认值是“PHPSESSID”;
3、session.cookie_lifetime:这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以Session不能永久使用!
4、session.gc_maxlifetime:这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除!
还有很多的设置,不过和本文相关的就是这些了,下面说下如何使用永久Session的原理和步骤。
前面说过,服务器通过SessionID来读取Session的数据,但是一般浏览器传送的SessionID在浏览器关闭后就没有了,那么我们只需要人为的设置SessionID并且保存下来,不就可以了。如果你拥有服务器的操作权限,那么设置这个非常非常的简单,只是需要进行如下的步骤:
1、把“session.use_cookies”设置为1,打开Cookie储存SessionID,不过默认就是1,一般不用修改;
2、把“session.cookie_lifetime”改为正无穷(当然没有正无穷的参数,不过999999999和正无穷也没有什么区别);
3、把“session.gc_maxlifetime”设置为和“session.cookie_lifetime”一样的时间;
在PHP的文档中明确指出,设定session有效期的参数是session.gc_maxlifetime。可以在php.ini文件中,或者通过ini_set()函数来修改这一参数。问题在于,经过多次测试,修改这个参数基本不起作用,session有效期仍然保持24分钟的默认值。
由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效。当一个有效请求发生时,PHP会根据全局变量session.gc_probability/session.gc_divisor(同样可以通过php.ini或者ini_set()函数来修改)的值,来决定是否启动一个GC(Garbage Collector)。
默认情况下,session.gc_probability = 1,session.gc_divisor =100,也就是说有1%的可能性会启动GC。GC的工作,就是扫描所有的session信息,用当前时间减去session的最后修改时间(modified date),同session.gc_maxlifetime参数进行比较,如果生存时间已经超过gc_maxlifetime,就把该session删除。
到此为止,工作一切正常。那为什么会发生gc_maxlifetime无效的情况呢?
在默认情况下,session信息会以文本文件的形式,被保存在系统的临时文件目录中。在Linux下,这一路径通常为tmp,在Windows下通常为C:WindowsTemp。当服务器上有多个PHP应用时,它们会把自己的session文件都保存在同一个目录中。同样地,这些PHP应用也会按一定机率启动GC,扫描所有的session文件。
问题在于,GC在工作时,并不会区分不同站点的session。举例言之,站点A的gc_maxlifetime设置为2小时,站点B的gc_maxlifetime设置为默认的24分钟。当站点B的GC启动时,它会扫描公用的临时文件目录,把所有超过24分钟的session文件全部删除掉,而不管它们来自于站点A或B。这样,站点A的gc_maxlifetime设置就形同虚设了。
找到问题所在,解决起来就很简单了。修改session.save_path参数,或者使用session_save_path()函数,把保存session的目录指向一个专用的目录,gc_maxlifetime参数工作正常了。
严格地来说,这算是PHP的一个bug?
还有一个问题就是,gc_maxlifetime只能保证session生存的最短时间,并不能够保存在超过这一时间之后session信息立即会得到删除。因为GC是按机率启动的,可能在某一个长时间内都没有被启动,那么大量的session在超过gc_maxlifetime以后仍然会有效。
解决这个问题的一个方法是,把session.gc_probability/session.gc_divisor的机率提高,如果提到100%,就会彻底解决这个问题,但显然会对性能造成严重的影响。另一个方法是自己在代码中判断当前session的生存时间,如果超出了 gc_maxlifetime,就清空当前session。
但是如果你没有服务器的操作权限,那就比较麻烦了,你需要通过PHP程序改写SessionID来实现永久的Session数据保存。查查php.net的函数手册,可以见到有“session_id”这个函数:如果没有设置参数,那么将返回当前的SessionID,如果设置了参数,就会将当前的SessionID设置为给出的值。
只要利用永久性的Cookie加上“session_id”函数,就可以实现永久Session数据保存了!
但是为了方便,我们需要知道服务器设置的“session.name”,但是一般用户都没有权限查看服务器的php.ini设置,不过PHP提供了一个非常好的函数“phpinfo”,利用这个可以查看几乎所有的PHP信息!


<?php
phpinfo();
?>


打开编辑器,输入上面的代码,然后在浏览器中运行这个程序,会见到PHP的相关信息。其中有一项“session.name”的参数,这个就是我们需要的服务器“session.name”,一般是“PHPSESSID”。
记下了SessionID的名称后,我们就可以实现永久的Session数据储存了!


<?php
session_start();
ini_set('session.save_path','/tmp/');
//6个钟头
ini_set('session.gc_maxlifetime',21600);
//保存一天
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, "/");
?>


另外对于设置php session的生存时间,网上看到有网友写了一个很不错的方法,这里将代码分享一下:


<?php
function start_session($expire=0){
if($expire==0){
$expire=ini_get('session.gc_maxlifetime');
}else{
ini_set('session.gc_maxlifetime',$expire);
}
if(empty($_COOKIE['PHPSESSID'])){
session_set_cookie_params($expire);
session_start();
}else{
session_start();
setcookie('PHPSESSID',session_id(),time()+$expire);
}
}
?>


使用方法也很简单,例如:


<?php start_session(600);//600秒以后过期


后记:其实真正的永久储存是不可能的,因为Cookie的保存时间有限,而服务器的空间也有限……但是对于一些需要保存时间比较长的站点,以上方法就已经足够了!

本文标题:php session-PHP 与 NodeJS 如何共用 Session?
本文地址: http://www.61k.com/1149170.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1