2016 该有个总结

2016年是一个不平凡的一年,也是感情生活丰富的一年,也是工作事业步入正轨的一年。收获了一枚女友,也如愿进入了梦想的公司,找到了自我。一切慢慢的变得好起来,也慢慢的循着我的5年小目标在前进。一切都是最好的安排,一切都是最好的选择,你今年总结了么?

阅读全文

企业级Redis环境部署

  • 哨兵配置文件参考:

    哨兵配置文件: etc/redis/sentinel.conf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sentinel monitor test1 10.10.10.152 6386 1
    sentinel down-after-milliseconds test1 5000
    sentinel failover-timeout test1 900000
    sentinel can-failover test1 yes
    sentinel parallel-syncs test1 2
    sentinel config-epoch test1 45
    sentinel leader-epoch test1 45
    sentinel known-slave test1 10.10.10.155 6387
    port 26379
    dir "/usr/local/etc"
    sentinel current-epoch 45
  • 备注:

    1
    2
    redis哨兵10.10.10.155, 哨兵端口(26379
    test1 10.10.10.152 6386 为其中一个监控的redis 主服务端口
  • 前提:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    哨兵:10.10.10.155
    redis端口 10.10.10.155 26379 实例启动 为哨兵服务
    命令:redis-server /usr/local/etc/sentinel.conf --sentinel
    本机:10.10.10.152
    redis端口 10.10.10.152 6386 实例启动 为主master服务
    命令:sudo redis-server /etc/redis/redis_master_6386.conf
    其他机:10.10.10.155
    redis端口 10.10.10.155 6387 实例启动 为从slave服务
    命令:sudo redis-server /etc/redis/redis_slave_6387.conf
  • 操作:

    1
    2
    3
    10.10.10.155机器上命令:
    redis-cli -h 10.10.10.155 -p 6387 进入redis
    slaveof 10.10.10.152 6386 这样本机(10.10.10.155)作为主(10.10.10.152 端口 6386)的从数据库了
  • 测试要点:

    1
    2
    3
    4
    5
    修改 27行 script_redis_monitor.php 文件 修改哨兵$_sentinels监控的IP和端口,修改为10.10.10.155 26379
    修改 141行 script_redis_monitor.php 文件 修改$address 为自己的邮件地址。
    停掉哨兵服务 redis-server /usr/local/etc/sentinel.conf --sentinel 这个进程停掉,运行 php script_redis_monitor.php 看邮件报警。<span style="color:red">记得重新启动</span>。
    停掉master服务sudo redis-server /etc/redis/redis_master_6386.conf 这个进程停掉, <span style="color:red">3秒内</span> 运行 php script_redis_monitor.php 看邮件报警。<span style="color:red">记得重新启动</span>。
    停掉master服务sudo redis-server /etc/redis/redis_master_6386.conf 这个进程停掉, <span style="color:red">同时</span> 停掉slave服务sudo redis-server /etc/redis/redis_slave_6387.conf 这个进程停掉,运行php script_redis_monitor.php 看邮件报警。

监控系统工具对比

测试一

flume

端口监控时 java cpu 负载 在10%~13%左右

"/img/flume1.png"

logstash

端口监控时 java cpu 负载 在8%~10%左右

"/img/logstash1.png"

1
相比较而言,在cpu负载方面,logstash更佳。

测试二

flume

请求shenzhenlong.newvip.youku.com页面,nginx生成的access.log 的log日志,请求10000次,耗费时间为1768.1288728714s,平均每请求一次耗时 0.1768s

"/img/flume10000.png"

logstash

请求shenzhenlong.newvip.youku.com页面,nginx生成的access.log 的log日志,请求10000次,耗费时间为1637.932365179s,平均每请求一次耗时 0.1637s

"/img/flume10000.png"

1
相比较而言,在请求延时方面,logstash更佳。

测试三

flume

利用rpc方式 直接写入flume ,请求10000次,发送时间为8.922s

发送时间:8.922s

"/img/flume_rpc.png"

收集时间:55.007 - 45.471 = 9.536s

"/img/flume_rpc1.png"

1
rpc方式直接写入flume 效率是 9.536 - 8.922 = 0.614s 说明响应时间为 每收集到10000条数据,发送到flume的agent 用时为0.614s

flume

利用写log方式 直接写入硬盘,然后flume收集 ,请求10000次,发送时间为1.006s

发送时间:1.006s

"/img/flume10001.png"

收集时间:57.172 - 53.001 = 4.171s

"/img/flume10002.png"

1
利用写log方式 然后flume收集 效率是 4.171 - 1.006 = 3.165s 说明响应时间为 每收集到10000条数据,flume的agent 收集到数据 用时为 3.165s

总结:

  1. 两种不同的log收集机制,利用rpc 直接调用写入flume的agent 延时小,效率高,每10000次日志生成,能比直接写入硬盘log 效率快5~6s 时间。
  2. 目前php调用实现rpc的方式需要进一步实现,暂时用java语言测试三,查看效率。
  3. 建议采用rpc方式直接写入agent方式,做demo出来,与现有logstash的收集方式做性能,负载,效率 等对比。

PHP类的自动加载

类的加载

  • require()和include()语句是语言结构,不是真正的函数。
  • require()和include()语句也可以不加圆括号而直接加参数。
  • require_once() 判断并加载文件。
  • include_once() 判断并加载文件。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    相同点:在脚本执行期间包括运行指定文件
    不同点: 1.incluce在用到时加载,require在一开始就加载
    2.include_once()和require_once()文件中的代码已经被包括了,则不会再次包括,
    以避免函数重定义以及变量重新赋值等问题。
    3.include引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码。
    4.require引入文件的时候,如果碰到错误,会给出提示,并停止运行下边的代码。
    问题: 1.多个文件中,类的命名重复问题。
    2. 一个文件中加载多个类文件。

类的懒加载

  • __autoload : 根据类名,找出类文件,然后require _once()
  • spl _autoload : spl _autoload _register注册多个自定义的autoload函数

  • __autoload : 定义路径法(path)和直接映射法(array)

  • spl _autoload : autoload调用堆栈,注册多个自定义的autoload函数

    缺陷: __autoload的最大缺陷是无法有多个autoload方法 
    

MVC加载原理

/img/flow.png

  1. include 配置

    1
    2
    3
    4
    'include' => array( 'application/catalog/controllers',
    'application/catalog/models', ),
    $include => array('application/controllers', 'application/models', 'application/library');
    set_include_path(get_include_path() . PATH_SEPARATOR .implode(PATH_SEPARATOR, $config['include']));
  2. autoload 方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static function autoload($class)
    {
    $path = '';
    $path = str_replace('_', '/', $class) . '.php';
    include_once($path);
    }
    }
    /**
    * sql自动加载
    */
    spl_autoload_register(array('Loader', 'autoload'));
  3. 路由实例化并唤醒类方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public function route()
    {
    if (class_exists($this->getController())) {
    $rc = new ReflectionClass($this->getController());
    if ($rc->hasMethod($this->getAction())) {
    $controller = $rc->newInstance();
    $method = $rc->getMethod($this->getAction());
    $method->invoke($controller);
    } else
    throw new Exception('no action');
    } else
    throw new Exception('no controller');
    }

Composer加载原理

  • __autoload 只能全局下加载,但在命名空间下无法实现

  • composer(包管理器)的应用

/img/composer.png

  1. psr-0

    1
    2
    3
    4
    5
    6
    7
    8
    {
    "autoload": {
    "psr-0": {
    "Foo\\": "src/",
    }
    }
    }
    路径生成: "Foo\\Bar\\Baz.php"
  2. psr-4

    1
    2
    3
    4
    5
    6
    7
    8
    {
    "autoload": {
    "psr-4": {
    "Foo\\": "src/",
    }
    }
    }
    路径生成: "src/Foo/Bar/Baz.php"
  3. class-map

    1
    2
    3
    4
    5
    6
    {
    "autoload": {
    "classmap": ["src/", "lib/", "Something.php"]
    }
    }
    路径生成: "src/Something.php"
  4. files

    1
    2
    3
    4
    5
    6
    {
    "autoload": {
    "files": ["src/MyLibrary/functions.php"]
    }
    }
    生成一个array
  • 加载原理

/img/autoload.png

其他

composer加载第三方库的演示

参考文档

  1. http://www.cnblogs.com/xia520pi/p/3697099.html
  2. http://www.jb51.net/article/31399.htm
  3. http://www.jb51.net/article/53876.htm

2015 该有个总结

2015年是一个跌跌撞撞的一年,工作中迷失自我,但是感情生活总算有了起色,遇到了一生的挚爱,她对我的爱胜过我对她的爱。整个下半年,沉浸在爱情的海洋里,对现在充满着留恋,对未来充满着期待,一切都是最好的安排!

阅读全文