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的独占锁。
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;
}
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】的方法来进行分段屏蔽错误了。
2007年09月11日 22:46
不要依赖 register_global=ON 的环境,从你刚懂得配置php运行环境甚至尚不明白register_global的ON/OFF会对自己有什么影响的那天起,就应该勇敢地把它设为OFF。
写程序前看看怎么用error_reporting。
不懂就问本身没错,但你需要在那之前查查手册。
当然,你需要懂得使用手册。手册上找不到答案的时候,应该考虑下网络上的搜索引擎。
刚学会php+mysql之后,不要叫嚷着要写论坛,要写XXX。要明白,刚学会写汉字并不表示你有能力写诗。
在学web编程的时候,你应该先去认识html这个朋友。
有点能力后,试着回答新手的问题,不要看到自己懂的而别人不懂就沾沾自喜,扔下一句“简单,那是基本的东西”就走更要不得。
思考是一个好习惯,不动手去写就等于空想,什么也没有。
写好一段程序,如果觉得很满意,一周后再看一遍,也许你会认为它应该有所改变。
有空多看看别人的程序,找出他人的不足或优点,自己掂量。