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来处理,而我们外网的生产服务器运算能力惊人,数据库还是干好存取工作吧。

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

205位童鞋围观 | 3条评论分类: PHP 标签:  

web socket 心跳包的实现方案05/30/2010

现在网络环境错综复杂,socket心跳包是获得健康强壮的连接的有效解决方案,今天,我们就在web socket中实现心跳包方案,是的,尽管我们只是做一个简单的聊天室,但我们让他稳定可靠一些一点也没有错。

我的心跳包方案很是简单,原理就是间隔发送心跳包数据给服务器,服务器在一定时间内发回心跳包响应,对比超时限定,如果超过设定的超时时间,则认为当前与服务器的websocket连接已经断开,关闭当前web socket连接,善后处理,例如重新连接,或者弹出提示……

比较有用的核心代码是这样子的:

function keepalive( ws ){
	var time = new Date();
	if( last_health != -1 && ( time.getTime() - last_health > health_timeout ) ){
			//此时即可以认为连接断开,可设置重连或者关闭连接
			$("#keeplive_box").html( "服务器没有响应." ).css({"color":"red"});
			//ws.close();
	}
	else{
		$("#keeplive_box").html( "连接正常" ).css({"color":"green"});
		if( ws.bufferedAmount == 0 ){
			ws.send( '~H#C~' );
		}
	}
}

这就是心跳函数,发送心跳包和检测心跳健康度。我们将其植入到websocket的onopen事件中,来开启心跳检测。像这样:

var ws = new WebSocket( to_url );
  ws.onopen=function(){
		$("#statustxt").html("connected.");
		$("#send_btn").attr("disabled", false);
		heartbeat_timer = setInterval( function(){keepalive(ws)}, 1000 );
	}

是的,这样子就可以实现web socket的心跳包,这里有些类似于多线程的发送方式,在发送心跳包的同时,并不影响正常的数据通信,我们的例子还是以上次的websocket聊天室来改进,我们可以发现,心跳包运行过程中,并不会干扰到我们的正常聊天。服务端我也进行了一些修改,原理类似,在超过一定时间内都没有收到客户端发来的心跳包,则认为该客户端已经掉线,关闭连接,收回资源。

Demo在这里:http://www.zendstudio.net/libs/websocket/chat/demo2.html

现在,有一个新的问题出现,如果我们要用php socket来模拟心跳包技术,该怎么实现?各位路过的朋友请多指教,感恩戴德。

607位童鞋围观 | 3条评论分类: JS/DIV/CSS, PHP 标签:  

开放型博客程序中应该实现的几个接口05/29/2010

互联网上的应用越发的五花八门,特别是进入web2.0以后,互联网更是把各地的人们紧紧的联系在了一起,为了掌握资讯,人们大量的使用搜索引擎来寻找自己想要知道的,自从有了RSS,比如我,就喜欢用google reader来订阅各种新鲜的资讯、先进的技术资源,这使得信息的呈现方式多样化,人们可以更为个性的、以更为适合自己的方式来获取和阅读资讯。

博客程序的出现,已有很多年的时间,然而未见其有所衰退,网民们还是很热衷于写博客,阅读博客,这还是一个很个性、独立的个人空间,我们可以写任何自己想写的东西。为了让自己写的东西更容易被别人找到,博客程序需要搜索引擎友好。搜索引擎技术也是不断进步,发展至今,其已经不仅仅是靠蜘蛛去抓取内容了,他们有了更好的技术,今天,就单独讲讲博客搜索吧!

百度开放平台的推出,确实是一个很大的进步,他的阿拉丁接口相当不错,从用户的角度看,可以不用点击进入目标网站,直接在搜索引擎即可了解到他想要知道的讯息。同时,它也支持blog ping接口了,该接口标准和google的blog ping是一样的,数据格式没有什么不同。这些API接口的推出,无疑是大大加快文章的收录速度,新鲜出炉的文字能够更快更广的发布传播出去,当然,前不久,google又推出了PubSubHubbub协议,这更是个伟大的创举,其实现了实时搜索!也就是XXX在微博上刚刚说了一句话,google通过使用PubSubHubbub就能马上呈现给对此话题感兴趣的用户。在技术上,我们一贯的承认,google是走在前列的。

从开放型博客程序的角度出发,那么以上讲到的都是主动技术,被动技术除了日志页面内容之外呢,还有RSS、RDF、Atom等等格式的被动呈现,用户可以在订阅了这些源之后,不用打开主页,只要在自己的阅读器里就可以浏览诸多的博客内容,感兴趣的可以再点击了解详细,发表评论等等,并且从阅读器可以一口气看很多的博客,而不用一个一个的来回切换,这是有效率的阅读方式。

所以,开放型博客程序已经不仅仅是将日志内容简单的显示出来完事的东西了,她需要默默工作的东西还有很多,除了以上的google ping,百度ping,RSS,RDF,Atom,甚至还需要更新sitemap,虽然很多人认为这是SEO,可是你的博客程序要显得有足够的开放性,这些都应该去实现,因为你根本不知道你的用户以哪种方式来阅读你发表的文字。是的,请相信这一点,就像我以前说的,多做一些,再多做一些

69位童鞋围观 | 发表评论分类: ITer, JS/DIV/CSS, PHP 标签:  

websocket 通信协议05/11/2010

websocket通信协议实现的是基于浏览器的原生socket,在客户端用JS即可轻松完成,前些天都在学习websocket 协议(但实际上websocket 协议甚为简约),并且粗略的思考过websocket的对于下一代web应用会产生怎样的影响,我想最大的巨变应该是就是实时性上吧!另外诸如上传大文件之类的优于http的应用。但问题也随之而来,服务端怎么办?前些天我弄了个websocket 聊天室的demo,现在还得在服务器上专门开个进程来跑呢,也许到时候不再是简单架设个web server就能跑应用的了。也许过不了多久,会出不同的服务端方案吧!先期待一下。

websocket的协议是很简单的,这里我把它分成客户端和服务端来讲。在客户端,new WebSocket即可实例化一个新的websocket对象,但其参数略微有一点不一样,参数格式是这样的ws://yourdomain:port/path ,这个从我的聊天室demo里面就可以轻松看出(ws = new WebSocket( “ws://www.zendstudio.net:9108/chat” ); ),WebSocket对象会自动解析这段字符串,发送到指定服务器端口,首先执行的是双方握手(handshake),客户端发送数据格式类似这样: 此文妙哉,快快看全文 »

921位童鞋围观 | 7条评论分类: JS/DIV/CSS, PHP 标签:  

给初学者:Zend Studio 不是全部05/05/2010

很多大力宣扬“工欲善其事,必先利其器”的文章都尖锐的指出,学习编程都必须要有一个强大的开发环境,许多初学者奉之为圣典,话是没错,再加上人们一谈到Zend Studio,铺天盖地千遍一律的都是以“Zend Studio是一个屡获大奖的专业 PHP 集成开发环境,具备功能强大的专业编辑工具和调试工具,……”,本站也一再强调Zend Studio是一个神器级的IDE开发工具,于是,很多接触php不久的童鞋更是感觉如获至宝,相见恨晚!俗语说“过犹不及”,着实如此,过份的强调工具,实在太本末倒置鸟!看到很多新手如此迷恋Zend Studio,今天,我不得不指出:Zend Studio 不是学习PHP的全部,PHP本身才是核心,基础才是重中之重!

我们来看一看,学习PHP到底是学习工具,还是学习语言?抑或是被工具玩,被语言玩?显然,根据本源理论,我们希望学到赤裸裸的原生态PHP,然而,刚刚会用php打印个“Hello World”,就开始下载zend studio,学习framework,学习MVC,搞“大型项目”,美其名曰,涉猎!。。。。唉~原始的快乐已经被太多的浮华所遮掩,让我们麻木的以为,那就是快乐!那就是PHP。这里,我不想去抨击框架的害人不浅,我也不想痛斥泛滥成灾的设计模式让很多人纸上谈兵,好高骛远。我还是就初学者应该怎样对待php语言和Zend Studio开发工具说点什么吧。 此文妙哉,快快看全文 »

1,592位童鞋围观 | 11条评论分类: ITer, PHP 标签:  

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

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

此文妙哉,快快看全文 »

240位童鞋围观 | 发表评论分类: PHP 标签:  

IE下json格式的一小点需要注意的地方04/22/2010

我在最近制作的一个后台程序中,使用一处json初始化一些信息,用于使用中的调用,我一直在firefox下进行调试和开发,自始至终没有发现任何有问题的地方,而且是后台程序,就几个管理员用,所以不用考虑太多表现上的问题,故就以Firefox作为标准了,我们用的JS库是jquery,其本身的浏览器兼容性亦非常好,而bug也就这么产生了。我的代码大致是这样子的:

var info = {"var1":1,"var2":2,"var3":3,};

问题也就这么出现了,由于我在多个成员之间频繁的添加和减少,导致末尾多出一个逗号。这个在firefox下可以正常使用,然而到了IE下就会报错,初始化不成功,后面的所有功能都出不来,大囧啊!

这个和PHP数组的最后一个逗号不太一样!最好还是不要多出来这个逗号,略作小记,提醒自己啊!

199位童鞋围观 | 3条评论分类: JS/DIV/CSS, PHP 标签:  

高并发、大流量网站架构时你考虑网卡流量了吗?02/07/2010

在我们的一个php服务器+db服务器的传统架构中,随着在线人数的不断增加,我们发现db服务器显得越来越不稳定,本来这完全是预料之中的一件事情,因为平时我们可能认为非常平常的一个数据库I/O操作,在高并发时都有可能导致db server宕机,在我们确认程序流程都合理的情况下,升级了CPU、内存和硬盘速率,但情况依旧,一到一定程度(这个程度显然比我们的预警值低很多,我们认为我们的硬件支撑这么多的在线是完全OK的),马上有丢包现象,而监测也表明DB服务器剩余资源很充裕!!!这是太奇怪的问题了,再次把所有的可能的瓶颈都检查了一遍以后,得出结论,这种现象是不可能的!天,难道有外星人在控制么?

此文妙哉,快快看全文 »

1,259位童鞋围观 | 10条评论分类: PHP 标签:  

[告示]7.0注册机源码丢失了02/01/2010

UPDATE: 测试了最新的zend studio 7.1.1,用下面的注册码仍然是可以注册的,算法未更新 :)

好久不见了,大伙儿都挺好吧!这一段时间我是出奇的忙,每天都很晚才回到住处,当然,这完全不能作为不更新博客的理由,可我真的分身乏术呀!
众所周知,x.zendstudio.net上存放有zend studio全系列的在线注册机,不料,在前不久的日子里,因为空间到期(我不用付费的,哥们免费给我开的),里面所有的文件被我哥们那个强大的虚拟主机管理系统毁灭性删除,一个不留!!!经多处寻找,苦无结果。。。。

史无前例!史无前例呀!不过所幸,飞信原来的服务器由于已经开源,所以也没有再继续开下去的必要了,对了,还有朋友问我怎么飞信的那个源码不能用了,是因为飞信协议有小幅的变动,没有时间去跟踪,所以大家包涵了~另外的都是我自己原创性的东西,所以我电脑里还能找的出来,问题不大。

现在zend studio 5.5.x和zend studio 6.x系列的在线注册机都已经恢复了,唯独zend studio 7.0的注册机源码突然找不到了,唉!等有时间我再去逆向一次吧,现在暂时只能提供7.0的注册码给大家了,抱歉了~

zend studio 7.0、7.1 注册码
Username: zendstudio.net
Serial Number: 3727234F6095F72034F6095F

339位童鞋围观 | 6条评论分类: ITer, PHP 标签:  

zend studio总是不好用?试试NB吧12/13/2009

NB是netbeans的缩写,一看这名字就很牛逼啊!而事实上,作为市场经济条件下的社会主义“四有”青年,我是不会盲目崇拜的,一直致力于找好用的php ide,我从netbeans 6.5开始也都一直试用,今天我觉得有必要跟大家推荐一下,网络上对netbeans的好评如潮,巨大的优点我就不多掺和了,做点实际些的吧,在6.7和以前的版本中,代码提示(系统函数)是需要按快捷键才出来的,而最新发布的netbeans 6.8正式版,是不需要的,自动提示,尽管初始化的时候略微显得有些缓慢,但完全可以接受。

相比zend studio,netbeans有如下几个优点:体积小全中文界面免费占用资源少。这几点无疑是让很多认为zend studio不好用的人的福音!没错,就是netbeans,而且据本人测试,崩溃的几率也很小。

接下来我说说使用netbeans的时候,容易碰到的问题,给下解决方法(基于windows XP),也就是调教netbeans.
此文妙哉,快快看全文 »

5,759位童鞋围观 | 34条评论分类: ITer, PHP 标签:  

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