Yii框架下安装xhprof

xhprof 是一款非常不错的php性能分析工具,由facebook开发,有直观的图形分析,可以看到各个流程的性能损耗。下面是在Yii框架下安装xhprof
1,安装xhprof
如果安装了php,很简单执行:pecl install xhprof 就可以了
否则找个靠谱的源 sudo yum install xhprof 也可以
2,配置php.ini

1 view plaincopy
[xhprof]  
extension=xhprof.so  
xhprof.output_dir=/home/work/tmp/xhprof  

其中oupput_idr 是输出文件的目录
3,安装libpng

wget http://nchc.dl.sourceforge.net/project/libpng/libpng15/1.5.1/libpng-1.5.1.tar.gz  
tar zxf libpng-1.5.1.tar.gz  
cd libpng-1.5.1  
./configure  
make  
make install 

或者直接sudo yum install libpng* 简单
4 安装Graphviz

 
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz  
tar zxf graphviz-2.24.0.tar.gz  
cd graphviz-2.24.0  
./configure --with-png=yes
make  
make install

5 配置nginx


server {  
    listen 8088;  
    root /home/work/local/php-5.5.18/lib/php/xhprof_html;  
  
    location @php {  
        include fastcgi_params;  
        fastcgi_param  SCRIPT_FILENAME "$document_root/index.php";  
        fastcgi_pass php;  
    }     
  
    location ~ /robots\.(txt|php) {  
        include fastcgi_params;  
        fastcgi_param  SCRIPT_FILENAME "$document_root/robots.php";  
        fastcgi_pass php;  
    }     
  
    location ~ \.php$ {  
        include fastcgi_params;  
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
        fastcgi_pass php;  
        fastcgi_index index.php;  
    }     
  
  
    location / {   
        try_files $uri @php;  
    }     
}  

重启nginx , nginx -s reload
重启php-fpm , pkill -USR2 php-fpm, php-fpm
6 配置Yii框架下使用xhprof
找到protected目录下的yii.php
加入以下代码

public static function createApplication($class,$config=null) {  
<span style="white-space:pre">    </span>$app->attachEventHandler("onBeginRequest", function() {  
                xhprof_enable(XHPROF_FLAGS_NO_BUILTINS);  
            });   
       $app->attachEventHandler("onEndRequest", function() use ($app) {  
                $data = xhprof_disable();   //返回运行数据  
                include_once "xhprof_lib/utils/xhprof_runs.php";  
                $objXhprofRun = new XHProfRuns_Default();   
                $run_id = $objXhprofRun->save_run($data, $app->name);  
            });   
}  

7 结束
打开你的任意网页,会在/home/work/tmp/xhprof目录下产生性能分析文件,之后通过localhost:8088/index.php就可以访问文件了,点击view_all_callgraph还可以看到直观的性能分析图。

[VIM]Linux下打造自己的IDE

对于用惯IDE的同学,突然用Vim会发现没有那么快捷和方便,以下用到的三个插件能打造VIM 比较方便的效果,先看效果:

要用到如此效果需要三个插件:
一 NERDTree
下载地址:http://www.vim.org/scripts/script.php?script_id=1658
然后解压,解压缩后把plugin,doc,syntax,nerdtree_plugin四个目录复制到/usr/share/vim/vim73/目录下,即可完成安装。
之后输入:NERDTre就可以打开
二 安装Taglist
taglist
下载下载Taglist
cp doc/taglist.txt /usr/share/vim/vim72/doc/
cp plugin/taglist.vim /usr/share/vim/vim72/plugin/
安装ctags => ctags -R
vimrc
let Tlist_Show_One_File=1 “只显示当前文件的tags
let Tlist_WinWidth=40 “设置taglist宽度
let Tlist_Exit_OnlyWindow=1 “tagList窗口是最后一个窗口,则退出Vim
let Tlist_Use_Right_Window=1 “在Vim窗口右侧显示taglist窗口
:Tlist就可以打开Taglist ,显示所有变量和函数
三 winmanager
前面介绍的几个工具和插件,主要提供快捷的编辑功能,如定义跳转,符号查询,符号提示与补全等。这里的三个插件,主要优化布置VIm的界面。具体来说,NERDTree提供树形浏览文件系统的界面,MiniBufExplorer提供多文件同时编辑功能,而Winmanager将这NERDTree界面和Taglist界面整合起来,使Vim更像VS!

分别从http://www.vim.org/scripts/script.php?script_id=1658
http://www.vim.org/scripts/script.php?script_id=159
http://www.vim.org/scripts/script.php?script_id=95
下载NERDTree,MiniBufExplorer和Winmanager安装包(Winmanager还有个更新的vba版本http://www.vim.org/scripts/script.php?script_id=1440,这里选用旧版本的Winmanger)。
1)像其它插件一样,将NERDTree安装包解压到~/.vim目录。并进入doc目录,在Vim命令行下运行”helptags .”命令。
2)MiniBufExplorer只有一个.vim文件,将其拷贝到~/.vim/plugin目录。
3)在~/.vimrc文件中加入以下几行:

let g:miniBufExplMapWindowNavVim = 1   
let g:miniBufExplMapWindowNavArrows = 1   
let g:miniBufExplMapCTabSwitchBufs = 1   
let g:miniBufExplModSelTarget = 1  
let g:miniBufExplMoreThanOne=0 

4)将Winmanager安装包解压到~/.vim目录。
5)在~/.vimrc文件中加入以下几行

let g:NERDTree_title="[NERDTree]"  
let g:winManagerWindowLayout="NERDTree|TagList"  
  
function! NERDTree_Start()  
    exec 'NERDTree'  
endfunction  
  
function! NERDTree_IsValid()  
    return 1  
endfunction  
  
nmap wm :WMToggle<CR> 

6)这个版本的Winmanager好像有个小bug,你在打开Winmanager界面时,会同时打开一个空的文件。这会影响后续使用,所以我们要在打开Winmanager时关掉这个空文件。在~/.vim/plugin目录下的winmanager.vim文件中找到以下函数定义并在第5行下添加第6行的内容:

1 view plaincopy
function! <SID>ToggleWindowsManager()  
   if IsWinManagerVisible()  
      call s:CloseWindowsManager()  
   else  
      call s:StartWindowsManager()  
      exe 'q'  
   end  
endfunction

到这里,就大功告成了!
好啦 可以愉快的使用VIM了!!~~

c++函数实现*的正则匹配判断功能

今天在面试的时候面试官出了一道算法题,给出字符串a和字符串b,其中字符串a含有*,这个匹配所有的正则表达式符号,让写出一个函数判断字符串b是否符合规则,面试的时候有些紧张,思路又有些乱,写了一晚上终于成功了,这里提供一下我的算法,欢迎交流沟通。首先贴上完成的代码:

#include<iostream>
using namespace std;

/**********************************************************************
* 名    称:bool match(char *a, char *b, int startA, int startB)
* 功    能:匹配字符串b是否符合正则表达式规则
* 输入参数:字符串a(带*号匹配规则), 字符串b(被匹配的字符), a字符串开始的位置startA, b字符串开始的位置startB
* 返回参数:bool类型
-----------------------------------------------------------------------
* 说    明:无
***********************************************************************/
bool match(char *a, char *b, int startA, int startB)
{
	//字符串a,b的长度
	int lenA   = strlen(a);
	int lenB   = strlen(b);
	//posB,b字符串的startB位置标记
	int	posB = startB;
	//a,b同时结束返回真
	if(startA == lenA && startB == lenB)
	{
		return true;
	}
	//不是*开头 一定要匹配b
	if(a[startA] != '*')
	{
		if(a[startA] != b[startB])
		{
			return false;
		}
		//递归
		return match(a, b, ++startA, ++startB);

	}else{
		//是*开头 找到非*开始的地方
		while(a[startA] == '*' && startA < lenA)
		{
			startA ++;
		}
		//以*结尾 同时遍历结束 返回真
		if(startA == lenA && startB == lenB)
		{
			return true;
		}
	}
	//记录a的位置
	int posA = startA;
	while(startB < lenB) 
	{
		//遍历b找到 与startA 相同的字符
		while(a[startA] != b[startB] && startB < lenB) 
		{
			startB ++;
		}	
		posB = startB;
		//相同均++, a到头或者a遍历到*结束
		while(a[startA] == b[startB] && startA < lenA && a[startA] != '*')
		{
			startA ++;
			startB ++;
		}
		//a遍历到*并且没有结束的情况递归
		while(a[startA] == '*' && startA < lenA) 
		{
			return match(a, b, startA, startB);
		}
		//a,b同时到头的情况,返回true
		if(startA == lenA && startB == lenB) {
			
			return true;
		}
		//没有发现满足的字符串,b的startB + 1,在次做遍历
		startA = posA;
		startB = posB + 1;
	}
	return false;
}


void main() 
{
	char *a = "*a*b*c*";
	char *b = "adbaeabeaeac";

	bool c = match(a, b, 0, 0);
	cout<<c<<endl;

}

算法解析:
函数是用C++写的,运用递归的思想。分为*开头和非*开头的情况。非*开头一路找到非*的位置开始匹配。
这里有个小坑,例如在字符串ababababcab中找abc的位置,这是比较常见的KMP算法,数据结构中有学,这里找到abc的位置后,两个字符串进行截取后再递归调用函数
测试用例:
分别进行了以下测试用例
字符串a为,字符串为符合和不符合的情况

测试通过!!
有兴趣的朋友们可以自己下载程序试一试,同时欢迎提供更好的算法。

Zend Studio 基本设置

使用IDE编码快捷方便,但是需要一些tab和编码风格的设置,下面是新手第一次配置IDE的简单方法。
一 连接远程文件
我们的代码文件全部放在linux开发机上,首先需要连接到开发机上的代码
1点击File->PHP Project from Remote Server

2,点击Manage,输入host及用户名密码,同时点击Test Connection测试连接是否正常。

3,接下来开始拉代码,会有树级目录,选择需要的目录即可。
注意Zend并不会实时更新Linux机器上的代码,如果在远端使用VIM直接修改文件后,记得在文件上点击右键->RemoteServers->Download from server更新代码。

二 设置Tab键默认为4个空格
为了兼容代码的格式,一般不建议使用Tab键,所以设置Tab为4个空格后,使用Tab全部变为4个空格,检测方法是用了Tab键再次按Back space键,如果一次只回一个空格距离,则设置成功。

1,点击Window->Preferences->General->Editors->TextEditors
在Displayed tab width 输入4

2,点击PHP->CodeStyle->Formatter->Edit选择Spaces 填入红色框中的数字4,4即可

3 最后在General->Workspace中选择UTF-8和Unix编码风格即可。

好啦,设置以上步骤后,就可以愉快的便代码啦!
*以上图片截取Zend Studio 10.6

[GIT]git创建及其使用心得

本文章涉及到了git的创建和基本操作,适合初学者使用

查看本地分支 git branch
切换分支 git checkout ‘name’
删除本地分支 git branch -d ‘name’
创建新分支 并切换到改分支 git checkout -b ‘name’
查看线上分支 git branch -r
克隆并创建分支 git checkout -b ‘newname’ master
本地分支提交到远程 git push origin ‘name’
撤销本地的修改 git checkout — 文件名
撤销本次提交的代码 git reset –hard HEAD~1

查看所有版本 git reflog
回到某个版本 git reset –hard XXXXX

分支提交 git push origin resblock 最后为分支名
分支下载 git pull origin resblock ‘resblock 为分支名’
删除远程分支 git push origin : 自己分支名 删除远程分支
合分支 git merge deyou(分支名) –no-ff git push origin master
rebase
在自己分支上进行 git rebase master 处理冲突后进行 git rebase –continue 放弃处理 git rebase -abort
git checkout –our

//暂存修改
git stash
git stash pop

//修改配置,快捷键
vim ~/.gitconfig
[alias]
last = log >—lg = log –color –graph –pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ –abbrev-commit
lg = log –color –graph –pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ –abbrev-commit
ci = commit
br = branch
co = checkout
df = diff
st = status

创建自己的git方法
1, 下载git 找到相应目录,git init
2, 根目录下去寻找.ssh目录。寻找SSH KEY

$ ssh-keygen -t rsa -C &quot;youremail@example.com&quot;

3, 登录github 打开account setting Add SSH KEY
4, Create
a new repo
5, 按照提示
//git init
//git add README.md
//git commit -m “first commit”
git remote add origin
git@github.com:wangchunwei/shulan.git
git push -u origin master

[算法]找数组中和为定值的数组对

一道简单的算法题,要求在数组中,找到所有和为定值的数组对。比如在array(11,11,1,2,-1,3,4,6,7,8,9,5,-1)中,找到所有和为10的数组对。
考虑到时间复杂度,牺牲空间,每个值作为一个key,他的互补对为value-key,每遍历一个数组值,先判断有没有互补对,有则打印此key,和互补key,互补key-1,否则添加一个key.php代码如下:

&lt;?php  
function findSum($arr, $sum) {  
    $total  = 0;  
    $sumArr = array();  
    foreach($arr as $key) {  
        //如果有此key,并且有和为sum的key,总数加一,失去一个互补key  
        if(isset($sumArr[$sum-$key]) &amp;&amp; ($sumArr[$sum-$key] &gt; 0)) {  
            $total ++ ;  
            //打印出来  
            $diff = $sum-$key;  
            echo &quot;($key, $diff)&lt;/br&gt;&quot;;  
            //互补key -1 
            $sumArr[$sum-$key] --;  
        }else{  
            //添加一个key  
            isset($sumArr[$key]) ?  $sumArr[$key]++ : ($sumArr[$key] = 1);  
        }  
    }  
    echo &quot;total:{$total}&quot;;  
}  
//测试用例  
$arr = array(11,11,1,2,-1,3,4,6,7,8,9,5,-1);  
findSum($arr, 10);  

测试结果为:
(-1, 11)
(6, 4)
(7, 3)
(8, 2)
(9, 1)
(-1, 11)
total:6

[应用]手机端连接本地服务器进行调试

目前开发涉及到手机开发,由于手机设置host比较麻烦,最好的就是可以让手机通过代理来访问开发机。下面介绍一种通过node服务来搭建代理的方式:

 

一、安装 nproxy

1.安装nodejs,去www.nodejs.org下载安装即可

2.安装nproxy,打开命令行,执行

npm install -g nproxy

安静的等待安装即可。

3.在命令行中运行 nproxy 即可启动代理服务。

二、设置手机代理

1.手机连接同一局域网下的WIFI

2.选中wifi,下面有个代理设置

代理服务器就是你机器的ip

端口默认8989

 

设置完毕后,就可以通过你本机访问测试环境了。

 

三、nproxy更多功能

   上面只是一个简单的代理,其实nproxy实现的功能比较多,前端多用来设置代理规则将服务代码指向本地代码。比fiddler方便多了

更多功能 https://www.npmjs.com/package/nproxy

搭配chrome插件 switchysharp使用更爽。

四、更多代理

还可以通过笔记本搭建热点的方式。(笔记本要有网线,通过笔记本wifi搭建热点),比如大家可以在无线中找到 dongyajie’s mac pro

win可以下载fiddler来设置代理,设置方式去网上搜搜。也可以设置规则,正则不太好写。

[PHP]运用PHPMailer发送带压缩附件的邮件

某些情况经常要定期收集信息,当数据量大时,附件就超过了邮件的限制,此时将附件压缩,在通过PHPMailer发送是一个简单可靠的方式。

1,首先下载PHPMailer的函数库  http://sourceforge.net/projects/phpmailer/,放在可以加载的地方

2,配置邮件参数

3,用Linux自带的命令zip -r $filename.zip $filename 压缩附件(或者安装的其他压缩方式,tar等)

4,加载附件发送邮件

    protected function _sendMail($subject, $content, $address = '')
    {           
        $mailer = new PHPmailer();
        
        $mailer-&gt;Host = 'smtp.163.com';
        $mailer-&gt;IsSMTP();
        $mailer-&gt;SMTPAuth = true;
        
        //链家邮件发件人设置
        $mailer-&gt;Username = &quot;willwcw&quot;;
        $mailer-&gt;Password = 'XXXXXXX';  //密码
        
        $mailer-&gt;From = &quot;willwcw@163.com&quot;;
        $mailer-&gt;FromName = &quot;通知邮件&quot;;
        $mailer-&gt;CharSet = &quot;UTF-8&quot;;

        //收件人设置
        $mailer-&gt;Encoding = &quot;base64&quot;;
        $mailer-&gt;AddAddress('xxxx@163.com'); 
        //$mailer-&gt;AddCC('webrd@l63.com');  //抄送

        $filename = $subject.&quot;.html&quot;;
        $file = fopen($filename, &quot;w+&quot;);
        fwrite($file, $content);
        fclose($file);
        //文件太大,采取压缩后附件形式
        //shell_exec(&quot;tar zcvf $filename.tar $filename &quot;);
        shell_exec(&quot;zip -r $filename.zip $filename &quot;);
        
        $mailer-&gt;IsHTML(true);
        $mailer-&gt;Subject = $subject;
        $mailer-&gt;Body =  $title = &quot;&lt;h1 align='center'&gt;&quot;.$this-&gt;yesterday.$filename.&quot;邮件提醒&lt;/h1&gt;&quot;;    
        $tarName = $filename.'.zip';
        $mailer-&gt;AddAttachment('./'.$tarName, &quot;$tarName&quot;);//附件的路径和附件名称
       
        if($mailer-&gt;Send()){
            Yii::info(&quot;send email $subject successful!&quot;);
        }else{
            Yii::warning(&quot;sendmail wrong&quot;, $mailer-&gt;ErrorInfo);
        }
        shell_exec(&quot;rm $tarName&quot;);
        shell_exec(&quot;rm $filename&quot;);
    }

[git]tig的安装及使用

tig 是git 的反转,类似文本功能查看git 的一些操作,非常直观和方便。
一 安装
安装tig前需要安装ncurses,这里推荐ncurses-5.9
1,下载ncurses.tar.gz 解压tar zxvf ncurses.tar.gz
2, 进入到目录./configure
3, make & make install
之后安装tig-2.1.1.tar.gz,同样的步骤
1,下载tig-2.1.1.tar.gz 解压tar zxvf tig-2.1.1.tar.gz
2, 进入到目录./configure
3, make & make install

二 使用
1,在git 目录按tig 进入commit 模式
2,按enter可以进入diff Q退出 pgup pgdn可以翻页
3,q退出diff
4,按t可以看tree view
5,tig blame 可以代替git blame
…..更多待作者我去发现啦