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

像google一样加一个两步密码验证03/11/2012

google的两步密码验证出来已经相当一段时间了,相信很多同学都用过,其工作原理是:

两步验证为您的 Google 帐户多加了一道安全防线

除了用户名和密码外,您还需要输入登录时 Google 通过短信或语音留言向您发送的验证码。

实际上这个东西就是类似网银口令卡的东西,但是这个实现起来更为简单,你在google账户开启了两步密码验证以后,你先得正确输入了密码,再拿出手机,查出当前的第二步密码,正确输入后才能访问你的账户,这个密码每30秒就过期并且会生成一个新密码,对了,这个东西叫做google authenticator,google是把他开源出来了的,并且有了IOS客户端Android客户端,Blackberry客户端,甚至有Nokia客户端(这个非官方出品),有算法用啥语言来实现,实际上已经不重要了!因此,用PHP来实现google authenticator算法根本不是问题,请看老外的代码 。

对!我们有了这些资源,就可以实现自己的两步密码验证了,实际上这个算法是一个叫做HOTP的东西,算法的核心根据密钥和时间戳或者计数器来算出一个一次性密码,像google authenticator是30秒一换(基于计数器的当然就是一次换一个啦),密钥只有google authenticator和服务器知道,暴露出来的仅仅是一个每30秒(或每次)换一次的token,也就是一次性密码。

google authenicator

太给力了,让我看完 »

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

php让服务器不返回chunked10/13/2011

chunked是http头部一个很特殊的东西,现代浏览器都支持解析Transfer-Encoding:chunked,chunked能更快的让页面呈现出来,因为它能分段下载,浏览器分段解析,对于大页面,这显然提高了可用性,facebook利用这个特性实现了牛逼的big pipe,那实在是将chunked发挥到淋漓尽致的应用了。

nginx好像默认就支持chunked,我还没有找到选项关闭,现在我想要获取一个服务器上的数据,该服务器头部默认包含了chunked,这个特性导致用php处理起来显得有些不爽,而且即使他分段提供,我还是需要把它全部读完才开始处理,虽然php可以很方便的http_chunked_decode,但我这人骨子里就是有点喜欢反人类,让服务器不要返回chunked的数据不就可以了吗?后来。。。。。后来还真让我想到了,chunked是http 1.1才有的东西,所以如果告诉服务器,我只能解析1.0,应该就解决问题了,请看烂代码示例:

让我膜拜一下全文吧 »

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

关于飞信2011贺岁版通信协议二三事03/20/2011

到今天为止,飞信2011贺岁版是中国移动发布的最新的飞信pc版本,他的协议和2010区别很小,sip部分仍然是使用的v4版本,除了登录部分修改了一下版本号以及增加了一些与聊天无关的额外功能之外,就没有什么变化了。

我曾经有一个小需求:每天早上8点给自己发一条当天的天气预报短信,经过仔细查看,在下发现飞信客户端上有一个定时短信功能,并且在主界面上可以将天气发送给自己或者朋友,这颇令人振奋,一度以为问题就此解决!!但是再细细观察,发现官方客户端无法做到自动发送,于是只能用程序来实现这个东西了,long long time ago,那是飞信的2008版,本人有用php实现了一下飞信的短信功能,当时也是想弄个博客提醒功能,出于年久失修,那个老代码已经不能使用鸟!

太给力了,让我看完 »

| 2条评论分类: 咸吃萝卜,我爱PHP,网络通信协议 标签:  

一个单引号引发的MYSQL性能损失12/22/2010

生活中难免遇到一些不如意,有些来自我们自身,而有些不是。今天冬至,说这一天是北半球白天最短、黑夜最长的。今天我们来分享下我的一个同事提到加没加单引号的巨大区别,对于MYSQL性能优化很有意义。

刚刚我们说过了,生活中难免会有一些不如意,比如,我们用一个字符串类型的字段来作为主键,表面上,这太不如意了,然而,事实也证明这是有用的。问题也就出来了,当在查询语句中对该字段值加上单引号和不加查询耗时相差百倍!

我建立的测试表是这样子的:

CREATE TABLE `foo` (
  `key` VARCHAR(10) NOT NULL,
  `time` INT(11) NOT NULL,
  PRIMARY KEY (`key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

让我膜拜一下全文吧 »

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

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

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

竟有如此美文,尽阅之 »

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

同事今天下午的MYSQL性能优化分享10/09/2010

下午的分享,同事讲了下关于mysql性能优化方面几个心得,很有意义,贴出来

1、分库分表

很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表members,查询起来非常之慢,同事的做法是将其散列到100个表中,分别从members0到members99,然后根据mid分发记录到这些表中,牛逼的代码大概是这样子:

<?php
for($i=0;$i< 100; $i++ ){
	//echo "CREATE TABLE db2.members{$i} LIKE db1.members<br>";
	echo "INSERT INTO members{$i} SELECT * FROM members WHERE mid%100={$i}<br>";
}
?>

让我膜拜一下全文吧 »

| 17条评论分类: 我爱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 标签:  

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