当前标签: 我爱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 标签:  

websocket 通信协议(已更新到version 13)05/11/2010

UPDATE:前些天有网友mail和我讨论websocket协议,当时颇忙!更惭愧的是,此篇文章竟已不能使用,原因是当时我写的还是websocket草稿时候的协议!终于,我将websocket 协议更新到了version 13版本 —–2012.5.19

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),客户端发送数据格式类似这样: 让我膜拜一下全文吧 »

| 28条评论分类: web前端编程,互联网2.0,网络通信协议 标签:  

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

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

竟有如此美文,尽阅之 »

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

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

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

此文妙哉,快快看全文 »

| 10条评论分类: 系统架构设计 标签:  

php广告系统应该具备哪些功能才是一个好用的广告系统04/09/2009

现代人的需求日益增长的速度是惊人的,在我们要求吃饱之后的吃好,而现在大家时髦的话题已经是减肥了。我们的系统中嵌入的模块也越来越多,机制越来越灵活,然而还是一直都不够用。我们来看看在各个成熟系统中早已司空见惯了的广告系统,也可以称呼为广告模块。
对于一个广告系统,我们的需求大概是这样的:
1、可以插入任何页面的任何位置。
2、可以插入图片、文字、代码、flash,并可以设定一些参数
3、一个广告位可以随机播放不同的广告
4、可以统计点击,甚至跟踪访客浏览路径
5、操作不要太繁琐

以上这些功能,几乎所有成熟的CMS、BBS系统都做到了,之所以还画蛇添足的把它写出来,实在是窃以为很多东西需要沉淀,总结才有进步的。找一个例子还看看上面的这些需求它是怎么做到的,比如ECSHOP,有一天我打开它的代码一看,在头部注释赫然写着“这不是一个自由软件”,让颇为认真仔细的读完了整句话,发现没事,因为起先我以为看它的代码是非法的。。。分析了一下它的广告模块,是非常符合上面提出的几点要求的,就操作上可能还是很显繁琐,首先要知道你想插入的位置位于哪个块(这个是“设置模板”功能),宽高多少,然后新建广告位,指定宽高,……它的广告还可以站外投放的,并且能够统计点击,这点做的非常好,其实在其模板中也是预留了位置(通过特定的标签)来添加广告的,这当然无可厚非,比很多系统的后台直接编辑模板源代码的操作要来的方便的多。广告也有自己的模板,这增加了灵活度,把系统模板拆成很多的小模块是非常值得学习借鉴的方法。呜呼!好像能总结的也就这么多呀,好了,文字不一定要多,能有点滴有用就行。如果是写作文,我估计我的老师会让我重写,但今天不一样,这是在写一些自由的东西,不做限制,长短两相宜。

| 4条评论分类: 我爱PHP,系统架构设计 标签:  

面向对象的程序设计语言C++10/12/2008

本无意写C++这玩意儿,这厮,人们对它的好评还少吗?当然就oop来说,大伙儿更为追捧java,嗯,姑且不说谁是老大了,因为俺对他们的认识和研究都颇为肤浅,不敢妄言的。
尽管偶也是学过java的人,但是对oop的理解以及思维方式似乎都还没有跟上,大有些一知半解的意思;这不,就决定学习下C++了(为啥不选java,因为java伤身体)。在很久很久以前,偶曾学习过C,并因此而学习了C描述版的《数据结构》(时间长达两个学期),所以,这种面向过程的模块化编程思想有些根深蒂固,后来接触php以后,更是一下子将这种思想发挥了出来(我当然不是说PHP是面向过程的语言,不过在当前,除了有限的几个底层操作类,其他的偶还是以自定义function为主哈),为我带来的直接影响是——靠双手填饱了自己的肚子之后便不思进取了。整个社会都在叫喊着oop,也有几位友人几次三番、几次三番的劝——”先生还是学一点吧!”
好的!我也是好说话的人,那就OOP吧,洗脑当选C++,因为它水果味,含钙高,一门顶过去五门……(咳咳,离题了~)开发环境就选C++Builder 我还整了个2009版,呵呵。

不要太过崇拜我的效率,我已经买书开始看了,书是一本叫做《面向对象程序设计语言C++》的,教材之类的很基础的东西,高深的俺也看不懂啊,本想买本原版书装逼一下的,无奈价格过于昂贵,跟这本比起来,得再搭4箱啤酒进去,经过周密的思考和细致的权衡,总结下来就是——”酒不能不喝!”,于是花重金买下这本国产书,毕竟支持民族文化事业也是大事嘛!
现在的计划是:从出版说明看到前言再到目录,再看序,嗯,就这么干 ……
(嗨!博客的风格终于不再搞了,最近有空的时候都在研究飞信、QQ的通信协议,以图他日做些机器人之类跟上时代的东西,顺便表扬一下,luma是个好同志。这文章越写越像咕叽咕叽了,靠!不写了)

| 发表评论分类: 咸吃萝卜 标签:  

博大精深的农历算法PHP代码04/10/2008

今天在phpchina上看到有人在寻php中的农历算法,记得偶以前在拜读bo-blog源码的时候,就隐约的注意到这个,而且还是相当经典的一个算法,于是就又把他挖出来,和大伙儿分享下,呜呼,似乎和3楼算法一样的,没有仔细看,现在还要加班呢!回头再看了~ 太给力了,让我看完 »

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

zend studio 5.5无法打开主界面故障解决方法一例03/12/2008

   我在使用XP系统,相信很多朋友和我一样,有一天,当我准备打开zendstudio 5.5.1——以下简称ZDE(ZendStudio 5.5.1下载)开始工作的时候,几乎是灾难性的故障发生了!ZDE在三次弹出下面的错误消息框后出现启动画面,之后不再有任何反应,不能进入主界面!
此文妙哉,快快看全文 »

| 7条评论分类: zend studio不知道 标签:  

PHP简单批量生成不重复的虚拟充值卡号密码03/07/2008

闲的蛋疼的时候,顺便加强下自己对PHP中数组操纵的一些技巧,就写了下面的一段小代码,可以随机生成卡号密码对应的数组,并且自动去重复,思路没有,纯粹瞎掰。
[codes=php]
<?php
$numLen=16;
$pwdLen=10;
$c=100;//生成100组卡号密码
$sNumArr=range(0,9);
$sPwdArr=array_merge($sNumArr,range('A','Z'));

$cards=array();
for($x=0;$x< $c;$x++){
  $tempNumStr=array();
  for($i=0;$i< $numLen;$i++){
    $tempNumStr[]=array_rand($sNumArr);
  }
  $tempPwdStr=array();
  for($i=0;$i< $pwdLen;$i++){
    $tempPwdStr[]=$sPwdArr[array_rand($sPwdArr)];    
  }
  $cards[$x]['no']=implode('',$tempNumStr);
  $cards[$x]['pwd']=implode('',$tempPwdStr);
}
array_unique($cards);
print_r($cards);
?>
[/codes]
混乱的说,算是给自己对数组的总结了。最近其实挺忙的,看看这篇日志的时间你大概就知道,我并没有闲的蛋疼~

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

在php中让用户自定义时区 正确显示当前时间03/02/2008

     php是外国人开发的,所以经常有很多东西不太好用,时间日期就是其中之一,经常直接显示时间日期(例如:date("Y-m-d H:i:s"))默认为UTC时间,表现是和北京时间差8个小时,因此我们需要将其+8个小时,原理是我们正好位于时区的东8区,但是这个问题是受到php.ini配置的date.timezone影响,当我们将其设置为Asia/Shang或Asia/Chongqing或者其他的东8区,显示出来的将是北京时间,或者在输出时间之前使用date_default_timezone_set()设置时区,也能正确的显示北京时间,问题是这样做都是相当的不灵活。

update:经测试,使用gmdate("U")是不正确的获取方式,与time()无别,只有使用time()-date('Z')才能做到获得UTC时间戳!特此更正,向各位致歉!谢谢支持。  –2008-3-12 21:04:25
此文妙哉,快快看全文 »

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

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