PHP SESSION 慎用

2010年06月15日 23:46
用户登录一般都会用到session,做webgame开发中我们没有用session

用cookie+memcache模拟了session的机制

但是,项目中还是写了session_start,设计之初是打算在项目中用做简单的缓存,实际应用中并没有用到。

这两天 研究ajax长连接session把我害苦了,webgame中多个ajax线程同时请求的情况经常出现,通过firebug监视ajax请求发现我们的ajax请求虽然是异步的,可还是出现顺序执行,只要第一个的ajax请求没有结束,第二个请求就被阻塞。

怀疑php的机制,怀疑 apache的机制,怀疑浏览器的机制,又研究了http://www.meebo.com/

最后,通过朋友的建议,先用静态页面做测试,终于发现,浏览器的机制没有问题,apache的处理机制也没有问题。

又用php动态页面测试,最终确定php的处理机制也没有问题。

但是,应用到我们的项目中就是有问题,通过对比发现,我们项目中用到了ob_star()为了做错误处理用,测试了ob_start() 也没有问题。

又仔细对比,发现项目中开启了session,在测试环境中开启session,果然问题出现了。

php的session默认使用的是文件存储,所以,每个页面打开的时候都会独占session的存储文件锁,把session_start 删除,终于解决ajax长连接阻塞的问题。

如果,你的项目中已经使用session,建议用数据库存储或者避免session的独占锁。

[Webgame必备]PHP全概率运算函数

2009年09月18日 15:43
/**
 * 全概率计算
 *
 * @param array $input array('a'=>0.5,'b'=>0.2,'c'=>0.4)
 * @param int $pow 小数点位数
 * @return array key
 */
function random($input, $pow = 2) {
    $much = pow(10, $pow);
    $max  = array_sum($input) * $much;
    $rand = mt_rand(1, $max);
    $base = 0;
    foreach ($input as $k => $v) {
        $min = $base * $much + 1;
        $max = ($base + $v) * $much;
        if ($min <= $rand && $rand <= $max) {
            return $k;
        } else {
            $base += $v;
        }
    }
    return false;
}

PHP分段屏蔽错误(异常)的方法

2009年06月30日 16:22
我是从asp转向php的,asp里面提供了下面的方法

代码1:
--------------------------------------------------------
on error remuse next
'这里的代码出现的错误可以被屏蔽掉
on error goto 0

----------------------------------------------------华丽的分割线-------------------------------------------------

转向php之后,查了一些资料貌似php没有提供类似这样的语法

直接使用error_reporting(0);关闭所有错误是很不明智的。所以,考虑使用@来抑制错误的发生,但是往往不如意。

我使用的set_error_handler('myerror')监听了一个函数,直接写@抑制错误的发生那是办不到的,照样会跳到myerror函数里面进行处理,后来看WordPress的源码,发现她屏蔽错误的方法:

代码2:
--------------------------------------------------------
$error_reporting = error_reporting(0);
// 这里发生的错误将被屏蔽
error_reporting($error_reporting);
--------------------------------------------------------

应用到我系统里面,发现此方法也不好用,照样会进入myerror函数进行错误处理。

继续狂翻php手册,仔细查看set_error_handler这个函数的说明,然后查看评论(一般看手册上的评论还是很有收获的),评论上的一段代码引起了我的注意:

代码3:
--------------------------------------------------------
// if error has been supressed with an @
if (error_reporting() == 0) {
return;
}
--------------------------------------------------------

细想了一下,把这段代码加入到myerror里面,果然ok了!原来使用@的时候,error_reporting()会返回0

这样可以利用@屏蔽某个函数里面发生的错误了,也可以使用【代码2】的方法来进行分段屏蔽错误了。

一家之言的经验之谈PHP扎实个人基本功

2007年09月11日 22:46
不要依赖 register_global=ON 的环境,从你刚懂得配置php运行环境甚至尚不明白register_global的ON/OFF会对自己有什么影响的那天起,就应该勇敢地把它设为OFF。

写程序前看看怎么用error_reporting。

不懂就问本身没错,但你需要在那之前查查手册。

当然,你需要懂得使用手册。手册上找不到答案的时候,应该考虑下网络上的搜索引擎。

刚学会php+mysql之后,不要叫嚷着要写论坛,要写XXX。要明白,刚学会写汉字并不表示你有能力写诗。

在学web编程的时候,你应该先去认识html这个朋友。

有点能力后,试着回答新手的问题,不要看到自己懂的而别人不懂就沾沾自喜,扔下一句“简单,那是基本的东西”就走更要不得。

思考是一个好习惯,不动手去写就等于空想,什么也没有。

写好一段程序,如果觉得很满意,一周后再看一遍,也许你会认为它应该有所改变。

有空多看看别人的程序,找出他人的不足或优点,自己掂量。

日历

« 2012 五月 »
 12345
6789101112
13141516171819
20212223242526
2728293031 

文章分类

Personal(0)
Internet(1)
Developer(4)
Webgame(1)
LazyCMS(0)