当前标签: 我爱PHP
问题是出在一次模拟http请求的把戏中,我之前还真没有注意到,但后来还是想明白了,多看看http协议不无坏处。当时我将其记录在内网了,发出来大家参考吧。教训啊,血淋淋的教训
在项目开发过程中,自己写了一个基于HTTP的API,来完成服务器之间的通讯,在直接用socket模拟POST请求的时候,异常缓慢,大约需要5秒钟才有响应(从服务端返回的头部来看:Keep-Alive: timeout=5,max=100),后来用PHP自带的SOAP扩展来完成,结果速度出奇的快!60ms左右。
同样是PHP差别为什么这么大?
后来把我自己写的HTTP头部的connection设置为close,速度也变的非常快,可是调试soap的那个请求,connection是keep-alive的,默认的不声明connection也会被apache设定为keep-alive(http1.1协议默认启用keep-alive),所以,依此解释,自己模拟的POST不会这么慢!
而且,通过ab测试,keep-alive所花费的时间是更短的,可是用php模拟就变的非常的长时间。。。。。。。。。。。。。唉!这到底是个什么诡异的问题呢。。。。
到现在为止,我实际上没有真正找到这个问题的答案,只是暂时的将http头部的connection设为close,使得php socket不会那么慢,个人认为soap的那个请求是客户端主动断开连接了,没有十足的证据。
222位童鞋围观 | 4条评论分类: 我爱PHP 标签: soap、socket、我爱PHP
写在前面的话:某天中午,我和同事们一起吃饭,期间我们聊到《XXX》游戏,不可否认,它确实很令人称赞,然后我问JJ,你多少级?他回8级,另个同事已经13级(高玩啊),然后我便开玩笑,JJ你个位数也好意思拿出来说,然后大家问我几级,我6级,哈哈哈,大家都笑了。。。师傅这时候说:“五十步笑百步,有意义么?”,当然这仅仅是我们几个开的一个玩笑。鲁迅先生曾说“文人相轻”,从我这么久泡论坛的经历来看,我们程序员也爱相轻,很多时候,我都觉得这个太不可思议了,技术本是拿来促进社会进步,改善生存环境的一种手段,大家都是同行,又有什么好互相看不起的呢?
进入正题,今天我打算总结下php自带的soap类的使用,总结才有进步。 此文妙哉,快快看全文 »
689位童鞋围观 | 6条评论分类: 我爱PHP 标签: soap、web service、我爱PHP
这实在不是一篇很新的技术文章,只是想起几年前参与的一个项目,当时通过php托管这项技术解决了购买昂贵的视频(VOD)点播系统的资金不足,并且还算自主研发,跟外界如此的吹牛说!这个。。。:-(,其实,写这篇文章我还是很有压力的,从谈到的技术来看,一定有人认为我是江郎才尽吃老本了,翻些陈辞滥调出来充数,可见我是顶着很大的舆论压力来写这篇文字的。不过,我还真的觉得这个php托管技术应用场景应该还是可以拓展的,姑且分享下这个“烂”技术吧。
当时的需求是这样的,只有我们的收费会员才可以看到我们精心制作的外语教程,这个教程是花费了很大成本的原创教程,因此很珍贵。我们打算按照观看时长来消费,而视频的格式居然是flv,当时我们找寻了很多的视频点播解决方案,要么就是昂贵的服务器、播放器+独有加密格式的全套解决方案,要么就是不靠谱的VIP在线电影播放系统。 此文妙哉,快快看全文 »
397位童鞋围观 | 7条评论分类: 咸吃萝卜,我爱PHP,系统架构设计 标签: header()、我爱PHP
这个问题对于大牛们来说,也许根本就不是个问题,我在以前的项目里,对于php数组中的所有的字符型索引(下标)都是采用变量的命名规则,即不使用关键字,不以数字开头,只包含大小写字母、数字和下划线,慢慢的这都快形成一个定势(思维定势是一件可怕的事情),然而在当下的项目中,语言包文件的数组,其字符索引形态万千,百花齐放。这让我颇不适应,就在我打算将其作为BUG提交上去的时候,QA以及外网内测数据反馈回来了,都没有在语言包这里出问题。我勒个擦!PHP的数组到底是怎么个回事? 此文妙哉,快快看全文 »
255位童鞋围观 | 2条评论分类: 我爱PHP 标签: 我爱PHP、数组
很早以前在学习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的调用形式越发频繁,到后来就干脆全是这样子的了。 此文妙哉,快快看全文 »
240位童鞋围观 | 5条评论分类: 我爱PHP 标签: callback、我爱PHP
唉!现在终于发现上学时不好好念书有多少的坏处了,概率几率对于我来说一直是一个很难弄清楚的问题。今天,我又继续让这个问题纠结上了。好吧!来说说我的那点事儿,首先注明一下:这是一篇求助性文字,我的几率算法也许根本就是不对的。如果恰巧有数学系专家学者路过,那希望您能留言说两句。问题是这样子的:在一个物品合成系统中,需要使用几件不同的物品来合成宝石,有不同的几率生成一颗(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 )这一行应该放到循环体的里面,说的也有道理呀!不过我觉得这样是不是多给了玩家机会?(当然,从玩家的角度来说,机会越多越好。呵呵~),截至记者发稿时止,我还是没有弄清楚是不是该把随机数放到循环里面?或者这两种方法都不对?麻烦路过的明眼人给俺说道说道,不甚感激
393位童鞋围观 | 19条评论分类: 我爱PHP 标签: 几率、我爱PHP、算法
这次的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来处理,而我们外网的生产服务器运算能力惊人,数据库还是干好存取工作吧。
——为什么今天讲了这么烂的话题和这么烂的数据库设计?——哥,你懂的!……
232位童鞋围观 | 3条评论分类: 我爱PHP 标签: 我爱PHP
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),客户端发送数据格式类似这样: 此文妙哉,快快看全文 »
1,311位童鞋围观 | 9条评论分类: web前端编程,互联网2.0,网络通信协议 标签: html5、websocket、我爱PHP
我们的一个项目已经上线运行,但一直都没有停止维护、修正和优化工作,并且还在不断的添加新功能,改善体验!这个项目的团队中有开发人员、测试人员和维护人员,这个系统上线以来外网用户一直都非常活跃,在线数稳步上升。我们知道,出于安全,在外网运行的项目,公司是有规定必须关闭错误,不向终端输出任何错误报告的。但是,我们面临了一个难以解决的问题。
此文妙哉,快快看全文 »
258位童鞋围观 | 发表评论分类: 我爱PHP 标签: error_reporting、我爱PHP
在我们的一个php服务器+db服务器的传统架构中,随着在线人数的不断增加,我们发现db服务器显得越来越不稳定,本来这完全是预料之中的一件事情,因为平时我们可能认为非常平常的一个数据库I/O操作,在高并发时都有可能导致db server宕机,在我们确认程序流程都合理的情况下,升级了CPU、内存和硬盘速率,但情况依旧,一到一定程度(这个程度显然比我们的预警值低很多,我们认为我们的硬件支撑这么多的在线是完全OK的),马上有丢包现象,而监测也表明DB服务器剩余资源很充裕!!!这是太奇怪的问题了,再次把所有的可能的瓶颈都检查了一遍以后,得出结论,这种现象是不可能的!天,难道有外星人在控制么?
此文妙哉,快快看全文 »
1,309位童鞋围观 | 10条评论分类: 系统架构设计 标签: 大流量网站、我爱PHP、数据库