当前分类: 我爱PHP

入门级的讲讲soap这个php webservice07/28/2010

写在前面的话:某天中午,我和同事们一起吃饭,期间我们聊到《XXX》游戏,不可否认,它确实很令人称赞,然后我问JJ,你多少级?他回8级,另个同事已经13级(高玩啊),然后我便开玩笑,JJ你个位数也好意思拿出来说,然后大家问我几级,我6级,哈哈哈,大家都笑了。。。师傅这时候说:“五十步笑百步,有意义么?”,当然这仅仅是我们几个开的一个玩笑。鲁迅先生曾说“文人相轻”,从我这么久泡论坛的经历来看,我们程序员也爱相轻,很多时候,我都觉得这个太不可思议了,技术本是拿来促进社会进步,改善生存环境的一种手段,大家都是同行,又有什么好互相看不起的呢?

进入正题,今天我打算总结下php自带的soap类的使用,总结才有进步。 此文妙哉,快快看全文 »

| 13条评论分类: 我爱PHP 标签:  

基于php托管的视频点播业务分级系统07/20/2010

这实在不是一篇很新的技术文章,只是想起几年前参与的一个项目,当时通过php托管这项技术解决了购买昂贵的视频(VOD)点播系统的资金不足,并且还算自主研发,跟外界如此的吹牛说!这个。。。:-(,其实,写这篇文章我还是很有压力的,从谈到的技术来看,一定有人认为我是江郎才尽吃老本了,翻些陈辞滥调出来充数,可见我是顶着很大的舆论压力来写这篇文字的。不过,我还真的觉得这个php托管技术应用场景应该还是可以拓展的,姑且分享下这个“烂”技术吧。

当时的需求是这样的,只有我们的收费会员才可以看到我们精心制作的外语教程,这个教程是花费了很大成本的原创教程,因此很珍贵。我们打算按照观看时长来消费,而视频的格式居然是flv,当时我们找寻了很多的视频点播解决方案,要么就是昂贵的服务器、播放器+独有加密格式的全套解决方案,要么就是不靠谱的VIP在线电影播放系统。 竟有如此美文,尽阅之 »

| 9条评论分类: 咸吃萝卜,我爱PHP,系统架构设计 标签:  

php数组的字符型索引是否应该遵循变量命名规则?06/29/2010

这个问题对于大牛们来说,也许根本就不是个问题,我在以前的项目里,对于php数组中的所有的字符型索引(下标)都是采用变量的命名规则,即不使用关键字,不以数字开头,只包含大小写字母、数字和下划线,慢慢的这都快形成一个定势(思维定势是一件可怕的事情),然而在当下的项目中,语言包文件的数组,其字符索引形态万千,百花齐放。这让我颇不适应,就在我打算将其作为BUG提交上去的时候,QA以及外网内测数据反馈回来了,都没有在语言包这里出问题。我勒个擦!PHP的数组到底是怎么个回事? 竟有如此美文,尽阅之 »

| 4条评论分类: 我爱PHP 标签:  

php的callback类型小记06/28/2010

很早以前在学习session的时候,其中有个session_set_save_handler()方法可以自定义session读写、销毁、回收动作,也就是通过这个方法实现将session保存进数据库的。当然,大多数时候看到的代码是定义几个函数:function sess_open(){} function sess_close(){}……,然后使用session_set_save_handler()将前面的函数名一一对应起来,这里是用字符串来表示函数名的。这就是php的callback类型,这是php4时代的写法,在php5和php面向对象编程迅速流行起来以后,在callback这里起了一点点的变化,我们看到了使用数组,即形如:session_set_save_handler( array( ‘session_cls’, ‘open’ ), array( ‘session_cls’, ‘close’ ), array( ‘session_cls’, ‘read’ ), array( ‘session_cls’, ‘write’ ), array( ‘session_cls’, ‘destroy’ ), array( ‘session_cls’, ‘gc’ ) ),明显多出一个类名,并且随着我阅读的优秀的开源项目的代码越来越多,这种callback的调用形式越发频繁,到后来就干脆全是这样子的了。 太给力了,让我看完 »

| 6条评论分类: 我爱PHP 标签:  

令人纠结的php几率算法问题06/24/2010

唉!现在终于发现上学时不好好念书有多少的坏处了,概率几率对于我来说一直是一个很难弄清楚的问题。今天,我又继续让这个问题纠结上了。好吧!来说说我的那点事儿,首先注明一下:这是一篇求助性文字,我的几率算法也许根本就是不对的。如果恰巧有数学系专家学者路过,那希望您能留言说两句。问题是这样子的:在一个物品合成系统中,需要使用几件不同的物品来合成宝石,有不同的几率生成一颗(50%)、两颗(16%)和三颗(2%)宝石,其余的为爆掉,即什么也得不到。

我的PHP代码实现是这样子的:

<?php
//初始化数组
$stone_arr = array( 
		array( 'num' => 1, 'prob' => '50%' ),
		array( 'num' => 2, 'prob' => '16%' ),
		array( 'num' => 3, 'prob' => '2%' )
		 );
//随机获得一个幸运数字
$luck_num = mt_rand( 0, 99 );
//初始化几率区间和最终宝石生产数目
$lucky_range = $made_num = 0;
 
foreach( $stone_arr as $sa ){
	$prob = intval( $sa['prob'] );
	if( $luck_num >= $lucky_range && $luck_num < $lucky_range + $prob ){
		$made_num = $sa['num'];
		break;
	}
	else{
		$lucky_range += $prob;
	}
}
 
for( $i = 0; $i < $made_num; $i++ ){
	//生产宝石的逻辑
}
 
?>

左思右想,我总觉得这个并没有问题,可我的同事坚持认为$luck_num = mt_rand( 0, 99 )这一行应该放到循环体的里面,说的也有道理呀!不过我觉得这样是不是多给了玩家机会?(当然,从玩家的角度来说,机会越多越好。呵呵~),截至记者发稿时止,我还是没有弄清楚是不是该把随机数放到循环里面?或者这两种方法都不对?麻烦路过的明眼人给俺说道说道,不甚感激

| 25条评论分类: 我爱PHP 标签:  

php函数strpos另外一个需要注意的地方06/05/2010

这次的bug让我印象比较深刻,居然出在strpos函数上,从标题来说,今天我要阐述的不是经典的strpos()===false的问题,而是在我设计的一个应用中,由于比较特殊的场景,而产生的bug。所以叫做“另一个”需要注意的地方,下面我就详细说说。

我们的项目强烈不推荐多表联合查询,这当然是系统架构决定的,同时也意味着我曾经长时间修炼的复杂的MYSQL查询语句,在当下项目中毫无用武之地。呜呼哀哉!架构决定数据库设计,在不复杂的一对多的情况,我们通常把他们放到一个表中处理。我做的应用的功能是一个用户组,需要对用户组中的用户设定一个数值来表示他的状态,另外,添加用户到组中或者踢出用户,我都把他放在同一字段中,该字段中的数据格式类似与这样: 状态#用户UID|状态#用户UID|状态#用户UID,设计的时候就是这样子设计的,要取出组中的成员很容易用explode就可以还原出来,那么,要检查一个用户UID是否存在该组中,我们自然用到strpos来做,看看他是否===false就可以了,先前我也是这么自然的思考的,但问题不知不觉的就产生了,由于用户UID的另个表中的自增主键,所以有这样的情况,例如某UID=143235,而另个UID=1432,那么用strpos判断肯定会返回true,即错误的认为本不是该组的成员,被判断为是该组成员,聪明的你一定会说用explode+in_array不就可以了么?实际上在这个应用中用户状态有5个值,他不是固定值,因此如果用explode+in_array的话,我们还需要循环一次。所以我修改了一下格式,变成:状态#用户UID|状态#用户UID|状态#用户UID|,看出不同了么?是的,最后将总是有一个竖线,这样用strpos来判断的时候用“#.用户UID.|”,就消除了BUG,用explode还原的时候array_pop一次即可消除最后的空数组。

实际上,除了strpos,str_replace有同样的问题,因此在踢出用户的时候也没有了bug。数据格式化部分全部由PHP来处理,而我们外网的生产服务器运算能力惊人,数据库还是干好存取工作吧。

——为什么今天讲了这么烂的话题和这么烂的数据库设计?——哥,你懂的!……

| 4条评论分类: 我爱PHP 标签:  

根据IP地址设置不同错误报告级别04/24/2010

我们的一个项目已经上线运行,但一直都没有停止维护、修正和优化工作,并且还在不断的添加新功能,改善体验!这个项目的团队中有开发人员、测试人员和维护人员,这个系统上线以来外网用户一直都非常活跃,在线数稳步上升。我们知道,出于安全,在外网运行的项目,公司是有规定必须关闭错误,不向终端输出任何错误报告的。但是,我们面临了一个难以解决的问题。

让我膜拜一下全文吧 »

| 发表评论分类: 我爱PHP 标签:  

php版fetion类源代码公开提供下载07/21/2009

首先声明:本人制作这个php版的飞信是基于飞信通信协议进行的黑盒研究,完全出于学习爱好研究之目的,谢绝用于商业用途!源码包含了我目前仍然免费提供的fetionserver.php,以及之前提供测试的a-client.php,压缩包中有vs_fetion(socket版).class.php和vs_fetion.class.php两个文件,视实际情况使用,协议是一样的,只是使用的php扩展不同,一般来说vs_fetion.class.php的兼容性更好一些。

OK,废话不多说,上菜!

下载php飞信源代码-vs_fetion

| 64条评论分类: 我爱PHP,有得下载哦,网络通信协议 标签:  

zend studio 7.0、7.1 注册码、注册机、激活码06/29/2009

前些天大家问及zend studio 7.0注册机(Zend Studio 7.x 在线注册机支持所有zend studio版本已经出来了)的事情,当时还没有搞出来。等有时间再说。今天别的咱先不说,提供个zend studio 7.0的注册码给大家应急,等在线注册机做出来了再发布(稍安勿躁,可能要等正式版出来以后或者在此几天以后),zend studio 7.0注册码如下:

Username: zendstudio.net
Serial Number: 3727234F6095F72034F6095F

不说别的,我注册是成功的,截个图您鉴别一下下。这千真万确使用该注册码注册的。
zend-studio-7-keygen
该zend studio 7.0的Build ID: 20090621(在about窗口中查看),大家注意鉴别啦

| 30条评论分类: zend studio不知道,我爱PHP 标签:  

使用php获得可靠的精准的当前时间通过授时服务器05/28/2009

有一种情形是这样子的,比如机票业务中的订票流程,我们需要一个非常可靠的当前时间来支持,尽管大多数服务器的时间是非常准确的,我们使用time()来获取的时间是可靠的,但未免会有不确切的情况,也有的服务器由于未开启ntp(Network Time Protocol)来进行时间同步,再由于硬件环境等因素,导致时间五花八门,这在通常,也就差个几分钟、最多几个小时的情况是无可厚非的,因为在同一个网站使用的是同一个时间,可是有的时候这样很糟糕。在internet上,有免费专门提供UTC时间校正的授时服务器,使用NTP协议,这个可以参考前面的链接来获取更多知识。他提供的时间误差在20ms左右(不要说在数据传输过程中会耗费的时间不等,NTP早就考虑到了这一点),因此通过这种授时服务器,我们就能得非常可信的当前时间。

太给力了,让我看完 »

| 1条评论分类: 我爱PHP,网络通信协议 标签:  

PHP界大牛们
反人类不分昼夜
牛掰级朋友圈子