PHP Styleguide

PHP Styleguide

Coding Style

  • 缩进使用4个空格
  • 行尾不能有空格
  • 操作符两边使用空格,逗号后面使用空格

      $sum = 1 + 1;
      call($a, $b);
      1 > 2 ? true : false; 
    
  • (,),[,]两边无空格

      test()['a'];
      $arr['data'] = 'test';
    
  • if语句

      if($a == 1) {
          echo 1;
      } else if($ == 2) {
          echo 2;
      } else {
          echo 0;
      }
    
  • switch语句

      switch($a) {
          case 1:
              echo 1;
              break;
          case 2:
              echo 2;
              break;
          default:
              echo 0;
              break;
      }
    
  • function定义

      function test() {
          echo 'test';
      }
    
  • class定义

      class A {
    
          private $a;
    
          public function printA() {
              echo $this->a;
          }
    
      }
    

命名规范

  • 类名首字母大写
  • 方法和变量使用驼峰
  • 常量全大写

PHP代码规范

最近写PHP比较多,自己总结一个代码规范,方便以后统一书写,避免各种纠结

todo

使用纯真IP库获取IP相关地理信息

下载纯真IP库文件,是一个二进制的dat文件

http://www.cz88.net/

在ThinkPHP中的实现

加入引导文件,静态工场+单例模式,防止重复实例化

<?php
class IpLocation_Bootstrap {

    private static $_instance = null;

    private function __construct() {

    }

    private function __clone() {

    }

    public static function getInstance() {
        import('ORG.Net.IpLocation');
        if(null == self::$_instance) {
            self::$_instance = new IpLocation();
        }
        return self::$_instance;
    }
}

PHP单例模式注意点

  • $_instance 必须声明为静态的私有变量
  • 构造函数和克隆函数必须声明为私有的,这是为了防止外部程序 new 类从而失去单例模式的意义
  • getInstance()方法必须声明为公有的,必须调用此方法以返回唯一实例的一个引用
  • ::操作符只能访问静态变量或静态函数
  • PHP的单例模式是相对而言的,因为PHP的解释运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存。在PHP中,所有的变量都是页面级的,无论是全局变量,还是类的静态成员,都会在页面执行完毕后被清空,结果会重新建立新的对象,这样也就完全失去了Singleton的意义。不过,在实际应用中同一个页面中可能会存在多个业务逻辑,这时单例模式就起到了很重要的作用,有效的避免了重复new 对象(注: new 对象会消耗内存资源)这么一个行为,所以我们说PHP的单例模式是相对而言的

加入ThinkPHP自带iplocation扩展类

IpLocation.class.php

IpLocation.class.php解读

纯真IP数据库格式详解

Php内存回收

最近在写一个从mysql导数据到memcache的php cli脚本,每次执行内存都一直上涨,内存没有回收,经过一晚的debug,终于在unset了以后释放了内存

private static function updateGlCache($field, $value, $tabname, $mem) {
    $cache_key = get_cache_key("gl_{$field}", $value);
    $tabnames = $mem->get($cache_key);

    if($tabnames == null) {
        $mem->set($cache_key, array($tabname));
        print_r("flushing:{$field}{$value}{$tabname}\n");
    }else {
        if(!in_array($tabname, $tabnames)) {
            array_push($tabnames, $tabname);
            $mem->set($cache_key, $tabnames);
            print_r("flushing:{$field}{$value}{$tabname}\n");
        }
    }

    unset($tabnames); //gc
    unset($cache_key); //gc
}

本少爷下厨(1)

鸡腿肉宫爆玉米粒

lunch

Centos下vsftpd配置

背景

每次为服务器添加ftp用户总要google,老记不住,运维那边也不是每次都那么有空可以帮忙配置,这次自己配好并mark下来

创建ftp用户

  • /usr/sbin/adduser -d /data/app/kis_support -g ftp -s /sbin/nologin jiangrongyong

adduser 代表添加jiangrongyong用户

并却不能登录系统(-s /sbin/nologin)

自己的所属文件夹,即ftp的根目录在(-d /data/app/kis_support)

属于组ftp(-g ftp)

  • 接着给用户创建passwd jiangrongyong,就大功告成了

Zf性能测试

背景

在最近一次压力测试中,发现zend framework框架的性能很差,请求一上来cpu就瞬间100%,而且qps很很不理想

实测

  • 两台服务器负载均衡情况下,使用ab的测试情况,测试程序使用zend framework打印hello world,cpu瞬间60%

ab -c 10 -n 2000 http://peifusvr/api/accttest/pfm

Server Software:        nginx/0.6.39
Server Hostname:        peifusvr
Server Port:            80

Document Path:          /api/accttest/pfm
Document Length:        17 bytes

Concurrency Level:      10

Time taken for tests:   5.656198 seconds
Complete requests:      2000
Failed requests:        0
Write errors:           0
Total transferred:      388000 bytes
HTML transferred:       34000 bytes
Requests per second:    353.59 [#/sec] (mean)
Time per request:       28.281 [ms] (mean)
Time per request:       2.828 [ms] (mean, across all concurrent requests)
Transfer rate:          66.83 [Kbytes/sec] received

Connection Times (ms)
          min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:    17   27   7.8     26      64
Waiting:       17   27   7.8     26      64
Total:         17   27   7.8     26      64

Percentage of the requests served within a certain time (ms)
   50%     26
   66%     29
   75%     32
   80%     34
   90%     39
   95%     43
   98%     48
   99%     53
  100%     64 (longest request)
  • 单台服务器情况下

ab -c 20 -n 2000 http://10.20.223.111/api/accttest/pfm

Server Software:        nginx
Server Hostname:        10.20.223.111
Server Port:            80
Document Path:          /api/accttest/pfm
Document Length:        17 bytes
Concurrency Level:      20
Time taken for tests:   11.552084 seconds
Complete requests:      2000
Failed requests:        0
Write errors:           0
Total transferred:      328000 bytes
HTML transferred:       34000 bytes
Requests per second:    173.13 [#/sec] (mean)
Time per request:       115.521 [ms] (mean)
Time per request:       5.776 [ms] (mean, across all concurrent requests)
Transfer rate:          27.70 [Kbytes/sec] received
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:    28  114  29.5    112     275
Waiting:       28  114  29.5    112     275
Total:         28  114  29.5    112     275
Percentage of the requests served within a certain time (ms)
  50%    112
  66%    124
  75%    132
  80%    138
  90%    154
  95%    166
  98%    183
  99%    195
 100%    275 (longest request)

北京首次之行

第一天

星期三,今天是启程之日,珠海大雾。今天八点有尼克斯对猛龙,当然要准时起床支持lin。九点半和琦焕出发,出租车->机场快线。到达机场时候还早,这时传来了振奋人心的消息,lin三分绝杀猛龙了,我们两个都很high。12点半,我们终于登机了,首次坐飞机,紧张并小心翼翼。在飞机上时间过得很快,感觉比坐车快多了,吃了又睡睡了又吃,过了三小时终于抵达传说中的帝都。机场快轨->10号线,去了趟公司,要见的人都见到了,很是高兴。晚上跟北京的同事吃饭,那天我们俩被灌了很多酒,连饭馆的名字都想不起来了,对了还吃了北京烤鸭。后来糊里糊涂回酒店早早就睡了。

第二天

星期四,白天上班,这边有免费咖啡奶茶,羡慕啊。晚上跟云飞和力峰吃饭,聊了一些。

第三天

星期五,晚上见孙健了,游了一趟奥林匹克,神马鸟巢 水立方。接着去了一间叫海碗馆的吃炸酱面,里面的羊肉汤不是人喝的,跟猪馊有得一比,炸酱面还可以。

第四天

星期六,今天去了天安门广场,故宫,国家博物馆,大前门。买了只烤鸭给老妈做手信。

第五天

星期日,回程之日,6点起床赶九点的飞机,珠海我回来了。