当前标签: 我爱PHP

遭遇php的in_array低性能08/28/2013

PHP的性能一直在提高。然而,若是用的不恰当,或是一个不留神,还是可能会踩到PHP内部实现方面的坑的。我在前几天的一个性能问题上就碰到了。

事情是这样子的,一位同事反馈我们的一个接口每次返回需要5秒之久,我们一起review了代码,“惊喜”的发现居然在循环(大约900次)中调用了一个读缓存的操作,而这个缓存的key并没有改变,因此我们把这段代码移到了循环外面,再测,接口返回时间降到了2秒,呜呼!虽然提升了1倍,但明显不是我们能接受的结果!

出现性能问题的代码量并不大,我们排除了IO问题以后,写了一段测试代码,果然问题很快重现。

< ?php
$y="1800";
$x = array();
for($j=0;$j&lt;2000;$j++){
        $x[]= "{$j}";
}
 
for($i=0;$i&lt;3000;$i++){
        if(in_array($y,$x)){
                continue;
        }
}
?>


shell$ time /usr/local/php/bin/php test.php

real 0m1.132s
user 0m1.118s
sys 0m0.015s

对的,我们用的就是字符串型的数字,从缓存拿出来就是这样子的啦!所以这里是特意转成字符串的(如果直接是数字,并不会出现这个问题 ,各位可以自行验证)。可以看出时间耗掉了1秒,才3000次循环,后面的sys用时也注定我们用strace不会拿到什么有效信息。
此文妙哉,快快看全文 »

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

如何提高自己的PHP修养——答一位读者来信05/20/2013

最近一位读者的来信,给了我很想说些什么的冲动,一直想说些总结性的东西,希望能够给一些正在迷茫、彷徨中的phper一点点微不足道的帮助,终于算是有了这个机会。

经来信读者同意,我将这篇颇具代表性的内容,全文贴上:
发件人:“小菜鸟”<7*******@qq.com>;
发送时间:2013年5月11日(星期六) 下午4:01
收件人:“16********”<16*****@*****.com>;
主题:hello gently
gently,您好!
在您的博客上看见这段幽默的文字:
2006,阳光普照,百废待兴!令人发指的是他竟然刚刚才悟懂了一点点的php入门知识,一个在2004年就接触php的人,为什么到2006年才刚刚弄 懂一点点入门呢?难道他沉睡了2年之久?还是去了火星一趟?种种疑问,我们不禁无比的感到好奇,本期内容就带您走进科学,走近博主。
才发现我接触PHP也将近两年了,但是一点皮毛都没怎么懂,哎,学习PHP的时候总是学学停停,走走停停也至于现在很迷茫、很纠结、很痛苦。
我现在在一个建站公司上班,套模板那种。有时候客户的需求需要在CMS的基础上做二次开发,以至于我根本无法下手。
几个需要二次开发的网站都没做下来,老板很不高兴!
我不知道我是否应该坚持学PHP开发,也不知道从何处坚持。
gently,您是过来人,求您给我一点指点。我相信听君一席话,胜读十年书!
我的回信如下:

竟有如此美文,尽阅之 »

| 23条评论分类: 我爱PHP,理想与现实 标签:  

一个很不错的适合PHPER们书单,推荐给大家【转】03/23/2013

来我博客的访客们中,有一些是PHP的初学者,是不是很迷茫PHP应该怎么学?应该买什么样的书?到处问人,到处求助?这下好了。

正好看到黑夜路人在博客上推荐了一个书单,看上去都非常不错,很多我也没有读过,所以你也不一定每一本都要阅过(怕你看到这么长长的一列吓到,呵呵),当然多读书总不会有坏处。

原文地址:https://blog.csdn.net/heiyeshuwu/article/details/8688324 ,这里就顺道推荐一下他的博客了,我也经常去逛

# PHP
《PHP程序设计》(第2版) –PHP语法和入门最好的书
《PHP5权威编程》 –PHP入门后升级书
《深入PHP:面向对象、模式与实践》(第3版) –理解PHP中的面向对象和设计模式
《高性能PHP应用开发》 –了解一些基本简单的PHP优化
《PHP核心技术与最佳实践》 –了解很多PHP高级技术和延伸技术
《Extending and Embedding PHP》–PHP内核介绍和扩展开发最好的书!没有之一!

# MySQL
《MySQL必知必会》 –极好的MySQL语法参考书
《MySQL 5 权威指南》(第3版) –MySQL综合全面使用书籍,适合入门
《深入浅出MySQL——数据库开发、优化与管理维护》 –很多实用的MySQL技巧
《MySQL性能调优与架构设计》 –关于很多架构和优化配置
《高可用MySQL:构建健壮的数据中心》 –DBA和架构理解有兴趣可以读
《高性能MySQL》(第2版) –适合DBA和开发的经典书籍!推荐!
《深入理解MySQL核心技术》 –初窥MySQL内部工作原理
《MySQL技术内幕:InnoDB存储引擎》 –目前深入分析InnoDB引擎最好的书

# Linux 管理:
《Linux 系统管理技术手册》 案头必备的工具书。
《鸟哥的 Linux 私房菜》不错的入门书。
《Linux 101 Hacks》常用命令手册
《UNIX Shell Scripting》写脚本的参考书
《The Linux Command Line》更详细的命令手册

# Linux 编程:
《Linux 系统编程》对常用 API 讲述最详细的一本书
《UNIX 环境高级编程》经典
《The Linux Programming Interface》与上本书配套
《程序员的自我修养》别被名字误导,极好的一本深度基础书。
《深入理解 Linux 内核》可以翻翻,对提升细节理解有好处。
《UNIX 网络编程》经典
《TCP/IP协议详细》第一卷 –经典的无以复加
《TCP/IP 高级编程》好书

# C/C++:
《C 程序设计语言》入门书
《Lnux C 编程一站式学习》Linux 下开发的入门书
《C 语言核心技术》参考手册
《彻底搞定 C 指针》最好的指针入门书
《C++ 编程思想》经典
《高质量程序设计指南——C/C++语言》经典
《C 专家编程》
《C 和指针》
《C 陷阱与缺陷》

# Golang:
《Learing Go》简单
《The Go Programming Language》比较详细
《The way to Go》提升

# Javascript:
《Javascript, A Beginner’s Guide》
《Object-Oriented Javascript》

# Python:
《Python Pocket Reference》适合经常翻翻
《Expert Python Programming》某些地方很有启发

# 其他:
《深入理解计算机系统》经典,必读
《计算机组成与设计》可以翻翻
《汇编语言》王爽 最好的汇编入门书
《数据结构》C 语言版 经典
《Java 数据结构和算法》更易阅读
《Debug Hacks 中文版》GDB 入门书
《设计模式——可复用面向对象软件的基础》经典
《MongoDB, The Definitive Guide》
《算法导论》第三版 –经典书籍
《数据库系统实现》(第2版)–想自己开发数据库可以看看
《精通正则表达式(第3版)》 –深入了解和使用正则

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

总结的一些PHP开发中的tips11/07/2010

以下这些tips,是我在实际工作中慢慢形成的,有些可能是不正确的,有些出于个人习惯,所以,千万不要把以下这些条当成什么标准,其中可能隐藏着天大的bug,代码可能正在病态的运行中,SO!请一定仔细的看过后想想,这么做的好处是什么?会产生怎样的负面影响?有问题特别欢迎你来和我讨论这就是我写这篇文字的目的,希望能和大家多多交流,也希望不断完善自己,同时又能给大家一些帮助。

太给力了,让我看完 »

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

php socket为什么这么慢,直到超时08/23/2010

问题是出在一次模拟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的那个请求是客户端主动断开连接了,没有十足的证据。

| 9条评论分类: 我爱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界大牛们
反人类不分昼夜
牛掰级朋友圈子