2016年5月10日 | 标签:

500 502 504的区别?什么情况下会出现?

502 Bad Gateway
502错误最通常的出现情况就是后端主机宕机
504 Gateway Time-out:作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。
500 服务器遇到错误,无法完成请求。

php进程挂掉 502
php执行超时(fastcgi_time) 504
php执行超时(max_execution_time ) 502
php-cgi进程数不够用 502
php内存超出上限(memory_limit) 500
程序语法错误 500

2015年5月26日 | 标签: ,

1、安装xhprof扩展

下载地址:https://pecl.php.net/package/xhprof

2、配置php.ini

[xhprof]
extension=xhprof.so
xhprof.output_dir=/tmp

3、下载web界面程序并部署
下载地址:https://github.com/phacility/xhprof
将apache或者nginx解析地址解析到xhprof_html目录

4、在你需要监控的页面或者应用中添加代码
a/页头添加如下代码

if (extension_loaded('xhprof')) {
    xhprof_enable();
}

b/页尾添加如下代码

if (extension_loaded("xhprof")) {
     $xhprof_name = "test001";
     $XHPROF_ROOT = "/vagrant_data/xhprof";
     include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
     include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

     $xhprof_data = xhprof_disable();
     $xhprof_runs = new XHProfRuns_Default();
     $run_id = $xhprof_runs->save_run($xhprof_data, $xhprof_name);

     echo "---------------\n".
     "Assuming you have set up the http based UI for \n".
     "XHProf at some address, you can view run at \n".
     "http://192.168.33.10:9998/index.php?run=$run_id&source=xhprof_foo\n".
     "---------------\n";
}

5、访问解析到xhprof的url

 

2015年5月26日 | 标签: ,

1、安装xdebug(不多做介绍)

2、配置php.ini的xdebug

配置文件如下

zend_extension = xdebug.so
[xdebug]
xdebug.auto_trace=on
xdebug.collect_params=on
xdebug.collect_return=on

xdebug.trace_output_dir=/vagrant_data/webgrind/tmp      #监控缓存文件存放目录
xdebug.remote_enable = on
xdebug.profiler_enable =off                             #禁止全部程序监控
xdebug.profiler_enable_trigger=on                       #触发监控
xdebug.profiler_output_dir = /vagrant_data/webgrind/tmp #监控缓存文件存放目录
xdebug.profiler_output_name = cachegrind.out.%t.%p      #生成文件格式

3、下载webgrind程序

下载地址:https://github.com/jokkedk/webgrind

4、安装graphviz

#aptitude install graphviz #graphviz 附带 dot 命令用于下文的配置

5、修改webgrind配置文件config.php

`$pythonExecutable`的值改为python命令路径

`$dotExecutable`的值改为dot命令路径

6、访问webgrind配置的web页面即可

 

2015年4月3日 | 标签:
测试1
普通sql
测试查询语句:
$result = zf_Service::loadModel('Account')->findOne('aid=475546');
$users = Account::find(475571);//$users = Account::where('aid', '=', 475547)->get();//
测试更新语句
zf_Service::loadModel('Account')->update(array('email'=>'a@qq.com'),"`aid`='475571'");
Account::where('aid', '=', 475571)->update(array('email' => 'as@qq.com'));
测试插入
zf_Service::loadModel('Test')->insert($insertData);//Test::create(array('name' => 'John'));

基本测试
********************************************************
测试类型        yaf+composer        yaf+zf
无sql执行       7ms                 13ms
查找            20ms(307ms)         20ms(136ms)
更新            25ms(236ms)         22ms(151ms)
插入            24ms(234ms)         25ms(126ms)

注:括号里面是循环100次执行的结果,括号外面为执行1次的结果

压力测试
********************************************************
测试类型            RPS        TPR         FR
无sql执行           306/183    3.5/5.3     194/194
有sql执行           136/140    7.2/7.1     208/198

注1:
斜线前面为yaf+composer结果斜线后面为yaf+zf结果

注2:
RPS: Requests per second(越高越好)
TPR: Time per request(越低越好)
FR : Failed requests(越低越好)

注3:
ab -n 2000 -c 100 http://192.168.8.234:7070/demo/index/test
ab -n 2000 -c 100 http://192.168.8.234:7071/demo/index/test
成为位于192.168.8.234
yaf+composer:/home/www/yaf
yaf+zf:/home/www/yaf-test

结论:再无sql执行的页面 yaf+composer要优于yaf+zf的执行效率
在有sql执行的页面yaf+composer与yaf+zf的效率相当,基本持平(但是yaf+composer管理项目可以写更少的代码)

使用的技术
composer(https://getcomposer.org/)
yaf
第三方类库
orm(illuminate/database)

php第三方包

https://packagist.org/
2015年3月31日 | 标签:

如何实现利用免费资源打造公有库以及私有库

开发规范的包文件,并将这些包发布到github or bitbucket打招共有以及私有库

  • 开发规范的library包文件
  • 创建共有包(github)
  • 创建私有包(bitbucket)
  • 如何使用https://packagist.org/
  • 项目中引入公共包
  • 项目中引入私有包

1. 如何开发规范的library包

参考教程:https://packagist.org/about

  • 创建组织架构

    组织架构如下:
    irpackagist                                     //根目录(irpackagis这个无所谓随便起)
        |---README.md                               //帮助文档
        |---composer.json                           //固定格式文件(必须)
        |---lib                                     //类库包目录(一般设为src或者lib)
             |---Iran                               //目录
                   |---Func                         //目录
                         |---StringHelp.php         //类库文件1
                         |---StringHelp2.php        //类库文件2
    
  • 编写类功能文件

    示例StringHelp.php如下:
    <?php
    namespace Iran\Func;
    class StringHelp{
        static public function dd(){
            echo 'dd test';
        }
    }
    
  • 创建composer.json文件:


    下面是composer.json示例:
    {
        "name": "iran/test",                                        //包名字(必须)
        "type": "library" ,
        "description": "my first test",
        "keywords": ["iran", "iranw"],
        "homepage": "http://www.phpno.com",
        "license": "MIT",
        "authors": [
            {"name": "Iran Wang", "email": "wang_wenguan@yeah.net"}
        ],
        "require": {
            "php": ">=5.3.2"
        },
        "require-dev": {
            "phpunit/phpunit": ">=3.7"
        },
        "autoload": {
            "psr-0": { "Iran\\Func\\": "lib/" }                     //自动加载
        }
    }
    

    composer.json参数参考文档 https://getcomposer.org/doc/04-schema.md

自此,一个标准的php包就算开发完毕^^ (装逼完成)—

2. 上传到Github公有化

抱着开放,开源,屌丝的气质,我们将此类包公有化。造福大众,恩泽天下(话说那个sb会用呢???)

  • 创建仓库

    直接登录github,web端创建仓库https://github.com/new (如果你不会 我只能哈哈了),这里我们创建irpackagist url:https://github.com/iranw/irpackagist
  • 上传本地代码->仓库

    代码上传流程:
    $cd /f/git-package/irpackagist
    $git clone https://github.com/iranw/irpackagist
    $git add --all                                              //将刚才开发的高性能包添加到git
    $git commit -m "test my private packagist"                  //注释
    $git config --global user.name "iranw"                      //记得替换你的用户名
    $git push origin master                                     //推送到github服务器
    $git tag -a v1.0 -m "my version 1.0"                        //创建版本标志
    $git push origin v1.0                                       //推送到特定版本标志
    

自此我们开发的包就已经在互联网上流行开来(如果主够nb的话 可能还会有人来挖你哦)

3. 上传到bitbucket私有化

有时候我们的包非常敏感,或者说我们非常自私。不允许别人来查看以及使用我们的包。那么,我们可以使用免费的bitbucket服务来服务我们的私有化包。
具体bitbucket是什么,自行google

具体上传步骤类似github,都是基于git的,不再详述

4. 包开放到packagist.org

将我们的共有包添加到packagist.org索引,以便别人更好的搜索。

只要在https://packagist.org/packages/submit页面将我们的github公共包url地址(例如https://github.com/iranw/irpackagist)
添加到输入框即可。之后你就可以在packagist.org的搜索框里搜索到你上传的包啦(^_^……)

注:添加的时候回验证你的composer.json正确性,所以严格按照要求填写。可以参考第三方包的书写格式

5. 如何引入共有包

  • 创建composer.json文件

在项目根目录创建composer.json文件 如下:

{
    "require": {
        "iran/test": "1.0"      #这个包就是刚才我们的上传的包
    }
}
  • 执行composer update

前提你的电脑需要安装composer工具,教程参考https://getcomposer.org/doc/00-intro.md

  • 入口布局

    框架目录结构如下:
    yafroot
        |---composer.json
        |---public
               |---index.php
        |---app
        |---vendor
               |---iran
                     |---test
                           |---lib
                                |---Iran
                                      |---Func
                                            |---String.php
    
  • 如何使用

    直接在入口文件使用样例:
    <?php
    require '../vendor/autoload.php';
    \Iran\Funcc\StringHelp::dd();
    

6. 如何引入私有包

私有包和共有包引入的的规则基本一致,只要在composer.json文件稍作修改即可

  • 私有包引入composer.json文件格式

    样例:
    {
        "require": {
            "iran/test": "1.0",                                     //共有库
            "iran/irpackagist3": "1.0"                              //私有库
        },
        "repositories": [
            {
                "type": "vcs",                                      //私有库类型
                "url": "https://bitbucket.org/iranw/test"           //私有库地址
            }
        ]
    }
    

注:在composer update的过程中需要输入私有库的用户密码

  • 如何使用

    直接在入口文件使用样例:
    <?php
    require '../vendor/autoload.php';
    \Iran\Funcc\StringHelp::dd();           //共有库函数调用
    \Iran\Funccc\StringHelp::dd();          //私有库函数调用
    

— 自此 整个共有库&私有库调用教程制作完毕 —

创建私有库的其他途径(自建镜像库,Sais,Artifact)

https://getcomposer.org/doc/05-repositories.md#hosting-your-own

2014年12月17日 | 标签:

作用:1、图片ajax提交 2、即时显示

插件地址:https://blueimp.github.io/jQuery-File-Upload/
实例地址:http://www.phpno.com/jQuery-File-Upload-master/demo.html

使用步骤:

1、页面引入特定的js(至少引入一下4个js)

<script src="http://btc.phpno.com/js/jquery/1.9.1.min.js?=1.03"></script>
<!-- The jQuery UI widget factory, can be omitted if jQuery UI is already included -->
<script src="js/vendor/jquery.ui.widget.js"></script>

<script src="js/jquery.iframe-transport.js"></script>
<!-- The basic File Upload plugin -->
<script src="js/jquery.fileupload.js"></script>

2、布置form表单

<form action="b.php" method="post">
<!-- 图片上传按钮 -->
<input id="fileupload" type="file" name="image" data-url="./a.php" multiple>
<!-- 图片展示模块 -->
<div class="files">
</div>
<div style="clear:both;"></div>
<!-- 图片上传进度条模块 -->
<div class="up_progress">
    <div class="progress-bar"></div>
</div>
<div style="clear:both;"></div>
<br/>
<button type="submit">Submit</button>
</form>

3、js编写以及css样式控制

<script type="text/javascript">
	//图片上传
	$("#fileupload").fileupload({
		dataType: 'json',
        add: function (e, data) {
        	var numItems = $('.files .images_zone').length;
        	if(numItems>=10){
        		alert('提交照片不能超过3张');
        		return false;
        	}
        	$('.up_progress .progress-bar').css('width','0px');
        	$('.up_progress').show();
        	$('.up_progress .progress-bar').html('Uploading...');
	        data.submit();
	    },
        done: function (e, data) {
        	$('.up_progress').hide();
        	$('.upl').remove();
            var d = data.result;
            if(d.status==0){
                alert("上传失败");
            }else{
            	var imgshow = '<div class="images_zone"><input type="hidden" name="imgs[]" value="'+d.msg+'" /><span><img src="'+d.msg+'"  /></span><a href="javascript:;">删除</a></div>';
            	jQuery('.files').append(imgshow);
            }
        },
        progressall: function (e, data) {
        	console.log(data);
            var progress = parseInt(data.loaded / data.total * 100, 10);
            $('.up_progress .progress-bar').css('width',progress + '%');
        }
    });

	//图片删除
	$('.files').on({
		mouseenter:function(){
			$(this).find('a').show();
		},
		mouseleave:function(){
			$(this).find('a').hide();
		},
	},'.images_zone');
	$('.files').on('click','.images_zone a',function(){
		$(this).parent().remove();
	});
</script>
<style type="text/css">
/* 图片展示样式 */
.images_zone{position:relative; width:120px;height:120px; overflow:hidden; float:left; margin:3px 5px 3px 0; background:#f0f0f0;border:5px solid #f0f0f0; }
.images_zone span{display:table-cell;text-align: center;vertical-align: middle;overflow: hidden;width: 120px;height: 120px;}
.images_zone span img{width:120px; vertical-align: middle;}
.images_zone a{text-align:center; position:absolute;bottom:0px;left:0px;background:rgba(255,255,255,0.5); display:block;width:100%; height:20px;line-height:20px; display:none; font-size:12px;}
/* 进度条样式 */
.up_progress{width: 300px;height: 13px;font-size: 10px;line-height: 14px;overflow: hidden;background: #e6e6e6;margin: 5px 0;display:none;}
.up_progress .progress-bar{height: 13px;background: #11ae6f;float: left;color: #fff;text-align: center;width:0%;}
</style>

4、程序端代码编写

<?php
header('Content-type: application/json');

if($_FILES["image"]["error"]!=0){
	$result = array('status'=>0,'msg'=>'上传错误');
	echo json_encode($result);exit();
}

if( !in_array($_FILES["image"]["type"], array('image/gif','image/jpeg','image/bmp')) ){
	$result = array('status'=>0,'msg'=>'图片格式错误');
	echo json_encode($result);exit();
}

if($_FILES["image"]["size"] > 2000000){//判断是否大于2M
	$result = array('status'=>0,'msg'=>'图片大小超过限制');
	echo json_encode($result);exit();
}

$filename = substr(md5(time()),0,10).mt_rand(1,10000);
$ext = pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION);

$localName = "./imgs/".$filename.'.'.$ext;

if ( move_uploaded_file($_FILES["image"]["tmp_name"], $localName) == true) {
	$lurl = 'http://api.gongchang.com/jQuery-File-Upload-master/'.$localName;
	$result  = array('status'=>1,'msg'=>$lurl);
}else{
	$result  = array('status'=>0,'msg'=>'error');
}
echo json_encode($result);

?>

5、就此完成

注:事件监控需要使用jquery的on函数

2014年10月12日 | 标签:
server {
 server_name  www.xxx.com;
 root /data/www/www_xxx_dev/wwwroot;
 set $index 'index.html';
 set $store_file $request_filename;
 if ($uri ~ /$ ){
  set $store_file $request_filename$index;
  rewrite (.*) $1index.html last;
 }
 location / {
  root "/data/www/www_xxx_dev/wwwroot";
  index index.html;
  proxy_store on;
  proxy_temp_path "/data/www/www_xxx_dev/wwwroot";
  proxy_set_header Host www.xxx.com;
  proxy_set_header X-Real-IP $remote_addr;
  if ( !-e $request_filename ) {
   proxy_pass http://www.xxx.com;
  }
 }
}
2014年8月15日 | 标签:

上一节我们讲了vim的目录树插件NERDTree 今天我们介绍另外一个vim高效开发的插件TagList

制作详细安装步骤,具体好处自行Google

安装TagList前提条件
使用taglist plugin,必须满足 一下三个条件:
a.打开vim的文件类型自动检测功能:filetype on
b.系统中装了Exuberant ctags工具,并且taglist plugin能够找到此工具(因为taglist需要调用它来生成tag文件)
c.你的vim支持system()调用 (一般都会支持)

——————————-以下为安装步骤————————————–

1、优先安装ctags

下载地址:http://ctags.sourceforge.net/
安装步骤如下

#wget -c http://prdownloads.sourceforge.net/ctags/ctags-5.8.tar.gz
#tar -zxvf ctags-5.8.tar.gz
#cd ctags-5.8
#./configure
#make
#make install

2、下载安装taglist 插件

下载地址: http://www.vim.org/scripts/script.php?script_id=273

安装步骤如下

#wget -O taglist.zip http://www.vim.org/scripts/download_script.php?src_id=19574
#unzip taglist.zip
#ls
#cp plugin/taglist.vim ~/.vim/plugin/
#cp doc/taglist.txt ~/.vim/doc/</pre>

3、修改配置文件(~/.vimrc)

" TagList 配置
let Tlist_Ctags_Cmd = '/usr/local/bin/ctags'
let Tlist_Show_One_File = 1
let Tlist_Exit_OnlyWindow = 1
let Tlist_Use_Right_Window = 1
map <silent> <F9> :TlistToggle<cr>

4、启动TlistTags
可以用”:TlistOpen“打开taglist窗口
用”:TlistClose“关闭taglist窗口
或者使用”:TlistToggle“在打开和关闭间切换。
也可以在vimrc中定义快捷键,使用键就可以打开/关闭taglist窗口:
map :TlistToggle

2014年8月13日 | 标签:

neretree插件地址

http://www.vim.org/scripts/script.php?script_id=1658

安装步骤:

1、建立文件夹

在用户根目录进入.vim目录(如果没有则创建) 并创建doc  plugin目录

#cd ~/.vim
#mkdir doc plugin

2、下载NERETree插件&解压

#wget -c http://www.vim.org/scripts/download_script.php?src_id=17123
#unzip neretree.zip
</a>

3、安装 将doc以及plugin文件copy到~/.vim/对应的目录下

#cp doc/NERD_tree.txt ~/.vim/doc/
#cp plugin/NERD_tree.vim ~/.vim/plugin/

完毕 打开vim 并:NERDTree回车

2014年8月2日 | 标签:

我们大众安装memcached扩展的时候 参考这个帖子即可

http://www.phpno.com/php-memcached.html

 

但是目前阿里云退出128M的ocs缓存服务,需要用上memcached的sasl认证 所以在安装编译的时候添加特定参数

安装libmemcached的时候要加上: –enable-sasl

# cd libmemcached-1.0.16/
# ./configure --prefix=/usr/local/libmemcached --with-memcached --enable-sasl
#make
#make  install

安装memcached的时候必须使用如下版本
wget http://pecl.php.net/get/memcached-2.1.0.tgz

安装如下

<code>$cd</code> <code>memcached-2.2.0b1
</code><code>$sudo</code> <code>/usr/local/php/bin/phpize
</code>$./configure --enable-memcached --with-php-config=/usr/local/php/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached --enable-memcached-sasl
<code>$sudo</code> <code>make
</code><code>$sudo</code> <code>make install
</code>