[原创]PHP实现类似ASP里的Application对象

日期:2010年1月21日 添加评论

以前搞过一段时间的asp,觉得application这个对象很爽。。可以很容易的写一个聊天室。。。后来逐渐转到php,就一直为这事郁闷。。因为php里面没有对应的东西。数据只能往数据库或者文件里面写才能实现共享。 今天在公司做聊天室的时候,灵机一动,居然让我发现了一神奇的方法~~哈哈:

PHP里面的$_SESSION变量可以实现类似Application的功能,但重点在它不能跨浏览器进程,或者说是跨用户。。只能是单个用户操作不同页面时候的变量传递,是一种cookie的替代方案。

众所周知,php里,调用session_start()之后,客户浏览器会收到一个大概名叫PHPSESSID的cookie,这个叫session_id。不同页面的参数共享就是靠这个变量实现的。

有时,由于客户端浏览器或者其他什么神奇的原因,导致无法正常发送 PHPSESSID的时候,我们可以手动发送,然后在php里面的session_start();之前,调用session_id(”sessionid在这里”);手工指定session_id ,这样,就可以让session工作正常。(比如浏览器不支持cookie,或用flash上传文件的时候)

好了,关键的东西来了。如果我们让每个用户的session_id都一样会怎么样? 哈哈。ASP的Application功能便呼之欲出~~~

实现方法非常简单:
在每个php页面的前面都写上下面的代码:
session_id(”xxxx”);
session_start();
然后,你就可以像用Application对象那样来使用$_SESSION了。。~~哈哈哈哈~~~爽吧~~

PS:ASP的Application对象是存储在内存里面的,而PHP的SESSION一般默认是用文件来存的。不过也可以设置php.ini让php用mysql数据库存,甚至用memcached来存~~具体方法就不详述了。。

chy提到session本来的作用是保存用户的登录信息等,是非常有用的。我这样一弄,session就失去了它原有的功能。所以我搞了一个函数,可以实现全局session和局部session共存。互不干扰。

/*
用法:
application('key','value'); //设置 key=value
$value = application('key'); //获取 key的值
*/

function application()
{
	$args = func_get_args(); //获取输入参数
	if (count($args) >2 || count($args) < 1) return;
	$ssid = session_id(); //保存当前session_id
	session_write_close(); //结束当前session
	ob_start(); //禁止全局session发送header
	session_id("xxx"); //注册全局session_id
	session_start(); //开启全局session
	$key = $args[0];
	if (count($args) == 2) //如果有第二个参数,那么表示写入全局session
	{
		$re = ($_SESSION[$key] = $args[1]);
	}
	else // 如果只有一个参数,那么返回该参数对应的value
	{
		$re = $_SESSION[$key];
	}
	session_write_close(); //结束全局session
	session_id($ssid); //重新注册上面被中断的非全局session
	session_start(); //重新开启
	ob_end_clean(); //抛弃刚刚由于session_start产生的一些header输出
	return $re;
}

当然,这样操作的成本有点高。。不过在实际使用中,基本不会遇到使用全局session和局部session的频率都很高的情况。所以可以按需求封装局部session或者是全局session。 上面那个函数封装的是全局session,稍微修改就可以实现局部session。

相关文章:


分类:程序们
标签:
  1. 2010年1月22日 at 09:45 | #1

    沙发,嗯嗯,很有意思啊,大概是看懂了。

  2. 2010年1月22日 at 11:46 | #2

    突然想到一个问题
    Session 的关键作用在于不同用户不同进程可以存储不同的数据,互不干扰。
    如果按你的方法让这些用户都公用session了,那么如果还需要分别存储不同的数据,比如用户个人的登录验证信息等等,如何处理?

    可以有两个session吗? 一个公用,一个私有?

  3. 2010年1月22日 at 13:03 | #3

    回复 chy:
    的确可以有几个session!我按照你的思路写了一个函数,可以实现全局session的封装,而且不影响普通session的使用。

    /*
    用法:
    application(’key’,'value’); //设置 key=value
    $value = application(’key’); //获取 key的值
    */

    function application()
    {
    $args = func_get_args(); //获取输入参数
    if (count($args) >2 || count($args) < 1) return;
    $ssid = session_id(); //保存当前session_id
    session_write_close(); //结束当前session
    ob_start(); //禁止全局session发送header
    session_id("xxx"); //注册全局session_id
    session_start(); //开启全局session
    $key = $args[0];
    if (count($args) == 2) //如果有第二个参数,那么表示写入全局session
    {
    $re = ($_SESSION[$key] = $args[1]);
    }
    else // 如果只有一个参数,那么返回该参数对应的value
    {
    $re = $_SESSION[$key];
    }
    session_write_close(); //结束全局session
    session_id($ssid); //重新注册上面被中断的非全局session
    session_start(); //重新开启
    ob_end_clean(); //抛弃刚刚由于session_start产生的一些header输出
    return $re;
    }
    当然,这样操作的成本有点高。。不过在实际使用中,基本不会遇到使用全局session和局部session的频率都很高的情况。所以可以按需求封装局部session或者是全局session。 上面那个函数封装的是全局session,稍微修改就可以实现局部session。

  4. 2010年1月22日 at 13:14 | #4

    回复 Vilic:
    呵呵。。我又更新了哦。。

  5. 2010年1月22日 at 14:33 | #5

    这么强!踩了!

  6. 2010年1月22日 at 22:33 | #6

    回复 Longbill:
    嗯.话说以后一定要学习PHP,不过现在还得找.NET空间.

  7. 2010年1月28日 at 12:31 | #7

    自从从ASP转向PHP,我也一直使用MYSQL建立并存储…

  8. 2010年2月1日 at 16:32 | #8

    哈哈学习了。

  9. 2010年2月25日 at 16:19 | #9

    session即文本存储,此法应该是毫无意义

  10. 2010年2月25日 at 16:21 | #10

    回复 msxcms:
    谁说session是文本存储? session可以存到文件,可以存到数据库,可以存到内存,可以存到memcahed等等

  11. 2010年2月25日 at 16:54 | #11

    回复 Longbill:
    既然这样,何必要Session中转一下呢?

  12. 2010年2月25日 at 16:57 | #12

    回复 msxcms:
    仅仅是为了方便使用。直接操作$_SESSION变量,而不用管文件读取存储或者数据库连接等问题。

  13. 2010年2月25日 at 16:59 | #13

    回复 Longbill:
    但是此法我个人极不推荐,让php走Session会大幅降低性能。设计起初应该就要想好架构,比如你想好用mysql,那就写几个简单的读写类或函数,memcached也雷同。

  14. 2010年2月25日 at 17:01 | #14

    回复 msxcms:
    这个东西当然不实用,仅仅是一个实现方式探讨,在某些情况下能派上用场。比如可以做临时计数器。。。等

  15. 2010年3月5日 at 22:36 | #15

    首页顶部那个是用cookie实现的哇????

  1. 还没有 trackbacks
订阅评论
视觉系火星播报河蟹娱乐朝花夕拾牛人很牛灰太狼软白沙八月洗澡火影那些事儿热豆腐