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/
	

centos下安装字体文件

编 写:袁 亮
时 间:2015-07-23
说 明:centos下安装字体文件

一、安装步骤
1、从本地找到需要的字体文件,通过winscp传到服务器上
本地目录:C:\Windows\Fonts
服务器目录:/usr/share/fonts/chinese/TrueType/
2、在字体目录下分别执行
cd /usr/share/fonts/chinese/TrueType/
mkfontscale
mkfontdir
fc-cache -fv
3、使改动生效
3.1 source /etc/profile
3.2 reboot重启
3.3 两个版本都有看到说,都试过,不确定哪个起的效果,懒得测了,后面有兴趣的在自己虚拟机上测试看看
4、export LC_CTYPE=en_US.UTF-8 英文优先
否则phantomJs那边截图还是乱码

二、一些问题
1、如果没有mkfontscale命令
yum install mkfontscale
2、没有fc-cache命令
yum install fontconfig

三、其他知识
1、locale
查看系统语言设置
2、fc-list
查看系统的字体库
3、fc-list :lang=zh
查看中文字体库
4、更改字体使用的先后顺序?只是临时更改
#export LC_CTYPE=en_US.UTF-8 英文优先
#export LC_CTYPE=zh_CN.UTF-8 中文优先
改完之后,可以看下fc-list :lang=zh的结果,会有变化,在使用phantomJs的时候,会有影响,据说是QT那边导致,具体不清楚

参考文档:
http://www.centoscn.com/image-text/config/2014/0913/3737.html

PhantomJS第一篇:安装及抓取网页为图片

编	写:袁	亮
时	间:2015-07-21
说	明:PhantomJS第一篇:安装及抓取网页为图片

一、是什么,解决什么问题
	1、是一个无界面的,webkit内核浏览器,能像一个真正的浏览器一样解析js,dom,css等
	2、应用场景
		抓取js后加载的内容
		将完整页面转为图片
		屏幕补抓
		自动化测试
		网络监控
	
二、下载安装:linux版
	1、2.0.0版本之前的,直接网上下载编译后的二进制文件即可,直接解压就可以运行
		如果找不到好的下载源,直接上249上,有1.4版本和1.9.8版本
		/opt/software/下
	2、源码安装
		2.1 下载源码
			a:直接下载某个版本
				wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.0.0-source.zip
				unzip phantomjs-2.0.0-source.zip
			b:git下载全部
				git clone git://github.com/ariya/phantomjs.git
				cd phantomjs
				git checkout 2.0
			c:下载太慢,直接从249上拷贝
				/opt/ci123/www/html/phantomjs
		2.2 安装依赖的模块
			yum -y install gcc gcc-c++ make flex bison gperf ruby \
			openssl-devel freetype-devel fontconfig-devel libicu-devel sqlite-devel \
			libpng-devel libjpeg-devel
		2.3 执行安装脚本(以小时记,好久好久...)
			./build.sh
	3、参考文档
		http://phantomjs.org/build.html
	4、执行方法
		./bin/phantomjs examples/post.js
			
三、下载安装:windows版本
	1、自行搜索下载
		http://phantomjs.org/download.html
	2、18上有2.0.0版本
		\\192.168.0.18\运维网络硬盘\r软件\phantomjs-2.0.0-windows.zip
	3、解压出来之后,可以直接运行
	4、命令行下执行:
		cd 到相应目录
		./bin/phantomjs.exe examples/post.js
		
四、简单使用,抓取一个网页,并保存为图片
	1、新建fetch.js文件
	2、输入以下代码
		var page = require('webpage').create();
		page.open('http://www.ci123.com/', function() {
			page.render('/opt/ci123/www/html/geekman/ci123.png');
			phantom.exit();
		});
	3、执行,并查看图片是否生成
		./bin/phantomjs fetch.js
		
五、遇到的问题及解决办法
	1、网页中的中文乱码,中文的地方,都是一堆方括号
		yum install bitmap-fonts bitmap-fonts-cjk
		ps:这个解决了乱码问题,但是导致了下面另外一个问题,坑了我大半天
	2、生成的png有一堆的透明效果
		www.ci123.com加使用美图看看导致,其实是正常的
		放在浏览器里看就正常了
	3、生成jpg格式图片,背景黑色
		执行之后,将body背景设置为白色即可
		page.evaluate(function(){
			document.body.bgColor = 'white';
		});
	4、有些内容后加载,导致页面有空白
		延时一定时间之后在渲染成图片
		window.setTimeout(function (){
			page.render("/opt/ci123/www/html/geekman/ci123.png");
			phantom.exit();
		}, 3000);
	5、有些内容,需要触发效应效果才出现,可以在page.evaluate中模拟
		page.evaluate(function(){
			document.body.bgColor = 'white';
			
			window.scrollTo(0,10000);//滚动到底部
			window.document.body.scrollTop = document.body.scrollHeight;
		});
	6、flash播放显示的内容,截取不到
		1.5版本之后就不再支持flash,如果要抓取flash的,需要安装1.4及之前的版本
	7、生成的图片,宽度不够,比如www.ci123.com大概只有960的样子
		设置webkit的宽高,让样式显示正常(可以调整这个的不同值,来抓取不同分辨率下的表现,特别是响应式布局的页面)
		page.viewportSize = {width: 1440,height: 800};
	8、在window下抓取,页面显示正常,但是在linux下抓取,页面排版跟浏览器上显示的有很大的区别
		8.1 版本一致,怀疑是版本的问题,装过1.4,1.5,1.9.2,1.9.8,2.0.0版本,都没用...
		8.2 百度、google了很久,发现别人都没这个问题
		8.3 怀疑是不是webkit内核不一样,所以在我的浏览器里正常,在服务器上的那个不一样,看过使用的webkit内核,是比较旧
			然后又是各种切换版本,测试,发现还是不行
		8.4 后来仔细看截出来的图,发现汉字跟浏览器里不大一样,怀疑是这个的问题
		8.5 将最开始安装的那两个中文字库删除,再截,发现,汉字乱码了,但是排版正常....
			所以问题就确定了,因为使用了不当的字体库,导致页面排版出错
		8.6 重装centos的字体库,又踩了个坑,这个见额外的文档

六、完整代码范例
	var page = require('webpage').create();
	page.viewportSize = {width: 1440,height: 800};
	var url = 'http://www.ci123.com/';
	page.open(url, function (status){
		if (status != "success")    {
			console.log('FAIL to load the address');
			phantom.exit();
		}

		var bb = page.evaluate(function()    {
			document.body.bgColor = 'white';

		// //此函数在目标页面执行的,上下文环境非本phantomjs,所以不能用到这个js中其他变量
			window.scrollTo(0,10000);//滚动到底部
			window.document.body.scrollTop = document.body.scrollHeight;
		});

		window.setTimeout(function (){
			page.render("/opt/ci123/www/html/geekman/ci123.png");
			phantom.exit();
		}, 3000);
	});
		
七、其他
	1、1.5版本之后不支持flash,如果要支持flash的话,请下载1.4以前的版本
	2、常用语法
		http://www.tuicool.com/articles/nieEVv
		http://www.cnblogs.com/justany/p/3279717.html
	3、官方文档
		http://phantomjs.org/documentation/
	4、examples文件夹下,有很多范例,直接参考使用,很好用
	

openssl第一篇:简单了解


编	写:袁	亮
时	间:2015-07-20 
说	明:openssl第一篇:简单了解

一、什么是openssl
	1、一个强大的安全套接字层密码库
	2、套接字:源ip,目的ip,协议,源端口,目的端口组成,通信的一种约定,想了解更多,请自行google
	3、建立在可靠的传输层协议TCP上
	4、主要功能:
		4.1 加密、解密在网络传输中的数据包,包含这些数据不被篡改和伪造(在网络传输数据前加密,收到数据,先解密再往上传)
		4.2 验证客户端和服务端的身份,只跟符合要求的另一方进行通信(正常的网络请求是没有验证的)
	
二、哪些地方使用到了
	1、绝大部分的https服务器
	2、支持https的浏览器(客户端)
	3、各种支付功能:比如支付宝、银联支付、微信支付等,都需要openssl支持
	4、对安全要求比较高的话,比如防止数据被伪造获取,传输内容被看到,都可以考虑使用
	
三、工作原理(摘自参考文章,大概了解即可)
	1、client送给server它自己本身使用的ssl的version(ssl一共有三个version),加密算法的一些配置
		和一些随机产生的数据,以及其他在SSL协议中需要用到的信息
	2、server送给client它自己的SSL的version,加密算法的配置,随机产生的数据,还会用自己的私有密钥加密SERVER-HELLO信息
		Server还同时把自己的证书文件给送过去。同时有个可选的项目,就是server可以要求需要客户的certificate
	3、client就用server送过来的certificate来验证server的身份。如果server身份验证没通过,本次通信结束。
		通过证书验证之后,得到server的公共密钥,解开server送来的被其用私有密钥加密过的SERVER-HELLO信息,看看对头与否
		(可理解为签名的过程,用来验证服务器身份)。
		如果不对,说明对方只有该server的公共密钥而没有私有密钥,必是假的。通信告吹。 
	4、client使用产生了的随机数据(sharedsecret),并且把这个随机数据用server发送过来的的公共密钥加密,
		此次加密过程产生本次握手中的premastersecret(这个步骤是有可能有server的参与的,由他们使用的加密算法决定)
		然后将它(premastersecret)送回给server,如果server要求需要验证client,那么client也需要自己把自己的证书送过去
		同时送一些自己签过名的数据过去。
	5、Server验证完client的身份之后,然后用自己的私有密钥解密得到premastersecret然后双方利用这个premastersecret来共同协商
		得到mastersecret(可理解为premastersecret为双方协商的暗号,然后使用这个暗号再协商一个mastersecret用来
		产生真正的会话密钥用来传输数据)以此来保证数据的决对安全。
    6、双方用mastersecret一起产生真正的sessionkey,然后就是他们在剩下的过程中的对称加密的key了。
		这个key还可以用来验证数据完整性。双方再交换结束信息。握手结束。
	
四、关键名称
	1、加密算法
		1.1 对称加密算法(加密和解密用的秘钥一致)
			一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4
			7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5
			des比较常用
		1.2 非对称加密算法(加密和解密用的秘钥不一致)
			包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)
			rsa和dsa是最流行的数字签名技术
	2、公钥、密钥
		2.1 公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥)
		2.2 公钥是密钥对中公开的部分,私钥则是非公开的部分
		2.3 使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密
			比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功
	3、数字证书
		3.1 由权威机构(CA)颁发
		3.2 包含公钥所有者信息、公钥内容以及证书授权中心的数字签名所组成的文件
		3.3 有效期内才有用
		3.4 证书格式
			cer:公钥证书格式
			pfx:私钥证书格式
	4、证书授权中心 CA (Certificate Authority)
		4.1 各家浏览器支持的ca机构也不尽相当,特别是对一些小的ca机构
		4.2 比较著名的ca机构:
			VeriSign:最大的认证机构,赛门铁克的子公司,管理世界13台根服务器中的2台,顶级域名中的.com和.net等,百度在用
			中国金融认证中心:http://cs.cfca.com.cn 银联证书就是使用的这个
			google internet authority g2:谷歌家的
			geotrust ssl ca g2:微信在使用
			StartCom 使用的也比较多
		4.3 出名的ca机构,证书比较贵,还有一些小的ca机构,虽然便宜,但是有些浏览器不认可,会提示不受信任,体验较差	
		4.4 火狐支持的ca机构:
			http://curl.haxx.se/ca/cacert.pem
附录:
	http://blog.itechol.com/space-33-do-blog-id-5158.html
	http://baike.baidu.com/link?url=q3wLEKuHy59qDRfIUMYnG0SnofPY0sI32c6N2-3u-zcf7qKB3vRu3v9Jlke0BkiwzcO9sEXDVln-ImZWhauVna
	http://my.oschina.net/0757/blog/207487

centos,开机时间同步问题

编	写:袁	亮
时	间:2015-07-21
说	明:centos,开机时间同步问题

一、定时同步标准时间
	1、方法1:rdate
		1.1 centos默认就有安装该命令/usr/bin/rdate
		1.2 加入到定时脚本,每小时同步一次时间
			10 * * * * /usr/bin/rdate -s rdate.darkorb.net
	
	2、方法2:ntpdate
		2.1 安装ntpdate从时间服务器更新时间,如果已有/usr/sbin/ntpdate,跳过本步骤
			yum install ntp
		2.2 测试是否能获取最新时间,看输出时间是否正确
			/usr/sbin/ntpdate time.nist.gov
		2.3 加入crontab,定时同步
			10 * * * * /usr/sbin/ntpdate time.nist.gov
二、虚拟机,设置不与宿主机进行时间同步
	1、如果是xen虚拟机安装的话,需要注意,默认是会跟宿主机进行时间同步的
	2、修改文件/proc/sys/xen/independent_wallclock
		内容改为1,设置虚拟机时间独立,不与宿主机同步
	3、为防止每次重启的时候,被重置,可以在开机启动脚本中添加设置,并同步一次时间
	

file_get_contents了解:自定义http请求

编	写:袁	亮
时	间:2015-07-17
说	明:file_get_contents了解:自定义http请求

一、使用原因
	1、这是一个使用非常频繁的函数,对应的file_put_contents,都是文件操作中第一选择
	2、抓取网络内容,一般情况下,也是使用的这个,但遇到稍微麻烦点的,我们就觉得没法子了
	3、curl等能做的,其实file_get_contents也基本上都能做,只是大家不熟悉
	
二、简单范例,直接看php.net
	array(
		'method'=>"GET",
		'header'=>"Accept-language: en\r\n" .
				  "Cookie: foo=bar\r\n"
	  )
	);

	$context = stream_context_create($opts);

	// Open the file using the HTTP headers set above
	$file = file_get_contents('http://www.example.com/', false, $context);
	
三、核心函数 stream_context_create
	1、支持以下协议,生成相应资源流上下文
		http://php.net/manual/zh/wrappers.php
		file:// — 访问本地文件系统
		http:// — 访问 HTTP(s) 网址
		ftp:// — 访问 FTP(s) URLs
		php:// — 访问各个输入/输出流(I/O streams)
		zlib:// — 压缩流
		data:// — 数据(RFC 2397)
		glob:// — 查找匹配的文件路径模式
		phar:// — PHP 归档
		ssh2:// — Secure Shell 2
		rar:// — RAR
		ogg:// — 音频流
		expect:// — 处理交互式的流
	
	2、http资源流支持参数:
		http:http://php.net/manual/zh/context.http.php
		http协议支持的参数,基本都支持
		header头,post数据,user_agent,代理,超时,跟随重定向等等
		
	3、post数据设置范例
		$postdata = http_build_query(
			array(
				'var1' => 'some content',
				'var2' => 'doh'
			)
		);
		$opts = array('http' =>
			array(
				'method'  => 'POST',
				'header'  => 'Content-type: application/x-www-form-urlencoded',
				'content' => $postdata
			)
		);
		$context = stream_context_create($opts);
		$result = file_get_contents('http://example.com/submit.php', false, $context);
		

curl番外:linux命令行下使用

编	写:袁	亮
时	间:2015-07-17
说	明:curl番外:linux命令行下使用

一、常用命令
	1、直接抓取网页
		curl http://www.ci123.com

	2、抓取数据,并保存成文件
		curl -O http://192.168.0.62/yl/curl/demo.php //需要后面有具体文件名,否则抓取不到
		curl -o index.html http://www.ci123.com
		
	3、仅显示http响应头
		curl -I http://www.ci123.com
		
	4、发送post数据
		4.1 普通post
			curl -d "username=name&nickname=暗夜御林" http://192.168.0.62/yl/curl/demo.php
		4.2 上传文件的时候,-F每次只能设置一个参数项,不能多个,文件名用@符号加载地址前
			curl -F "file=@51268106.html" -F "username=name" -F "nickname=暗夜御林" http://192.168.0.62/yl/curl/demo.php
	
	5、模拟登陆,使用cookie文件夹
		5.1 将cookie写入到本地文件(使用-F可以)
			curl -c cookie.txt http://192.168.0.62/yl/curl/demo.php
			curl -D cookie.txt http://192.168.0.62/yl/curl/demo.php //直接将响应头存储进文件
		5.2 使用本地存储的cookie文件发送请求
			curl -b cookie.txt http://192.168.0.62/yl/curl/demo.php
			
	6、伪造referer
		curl -e 'http://www.baidu.com' http://192.168.0.62/yl/curl/demo.php
	
	7、使用代理访问(找免费代理,翻墙出去,google搜索比较给力)
		curl -x 124.202.183.170:8118 http://www.baidu.com
		

fsockopen初阶:了解并使用

编	写:袁	亮
时	间:2015-07-16
说	明:fsockopen初阶:了解并使用

一、作用(简单使用)
	1、类似file_get_contents,curl,在程序中,发起一次网络请求,抓取数据或者调用接口等
	2、curl能干的事,这个也都能干
	3、在发起http请求的时候,会对http整个工作过程更熟悉,每一步都很清楚
	
二、工作流程
	1、使用fsockopen打开一个网络连接或者一个Unix套接字连接
	2、使用fwrite,传输请求头信息
	3、使用fgets读取响应
	4、使用fclose关闭套接字
	ps:一个完整的http请求,更清晰些,平时访问网页的时候,浏览器帮我们做的这些工作

三、使用条件
	1、php配置中开启 allow_url_fopen
		
四、简单范例,php.net
	
	$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
	if (!$fp) {
		echo "$errstr ($errno)
\n"; } else { $out = "GET / HTTP/1.1\r\n"; $out .= "Host: www.example.com\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); }
五、函数封装 header("Content-Type:text/html;charset=utf-8;"); $data = fsockOpenHttp("http://local.ci123.com/yl/fsockopen/t.php",'POST',array('username'=>'yuanliang847','nickname'=>'暗夜御林')); var_export($data); //图片上传的暂未封装,可以自己看下firebug中上传图片时的请求信息,然后封装 function fsockOpenHttp($url, $method='GET', $postfields = NULL , $multi = false){ $url = trim($url); if(!$url){ return array('status'=>4001,'mess'=>'链接不能为空'); } $urlinfo = parse_url($url); if(!$urlinfo['host']){ return array('status'=>4002,'mess'=>'链接非法,请填写完整链接地址'); } if($urlinfo['scheme'] == 'https'){//判断是否是https请求 $port = 443; $version = '1.1'; $host = 'ssl://'.$urlinfo['host']; }else{ $port = 80; $version = '1.0'; $host = $urlinfo['host']; } $urlinfo['path'] = $urlinfo['path']?$urlinfo['path']:'/'; $header = "{$method} {$urlinfo['path']} HTTP/$version\r\n"; $header .= "Host: {$urlinfo['host']}\r\n"; if($multi){ //$header .= "Content-Type: multipart/form-data; boundary=\r\n"; }else{ $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; } if(strtolower($method) == 'post' ){ if(is_array($postfields)){ $postfields = http_build_query($postfields); } $header .= "Content-Length: ".strlen($postfields)."\r\n"; $header .= "Connection: Close\r\n\r\n"; $header .= $postfields; }else{ $header .= "Connection: Close\r\n\r\n"; } $ret = ''; $fp = fsockopen($host,$port,$errno,$errstr,30); if(!$fp){ return array('status'=>4003,'mess'=>'建立sock连接失败'); } fwrite ($fp, $header); while (!feof($fp)) { $ret .= fgets($fp, 4096); } fclose($fp); $info = split("\r\n\r\n",$ret); $t = array_slice($info,1); $returnInfo = implode('',$t); $head = $info[0]; $tmp = split("\r\n", $head); $tmp = split(" ", $tmp[0]); $http_status = $tmp[1]; $html = iconv("utf-8","utf-8//ignore",$returnInfo); return array( 'status' => '1', 'mess' => '请求成功', 'http_status'=> $http_status,//http响应头 'head' => $head,//完整返回头 'data' => $html//响应内容 ); }