Laravel 依赖注入的实现

依赖注入


网上已经有许多不错的文章介绍依赖注入了,维基百科-DI也有其详细的介绍。

翻译一段PHP-DI官网的解释

在没有使用依赖注入的框架代码中:

  • App需要Foo
  • App创建了Foo
  • App调用了Foo
    • Foo需要Bar
    • Foo创建Bar
    • Foo调用Bar
      • Bar需要Bim
      • Bar创建Bim
      • Bar调用Bim
        • Bim做某些事情
      • Bar做某些事情
    • Foo做某些事情

在实现了依赖注入的框架代码中:

  • App需要Foo,Foo需要Bar,Bar需要Bim
  • App创建Bim
  • App创建Bar,并提供Bim
  • App创建Foo,并提供Bar
  • App调用Foo
    • Foo调用Bar
      • Bar调用Bim
        • Bim做某些事情
      • Bar做某些事情
    • Foo做某些事情

App在这里就相当于一个IOC(Inversion of Control控制反转)容器,依赖注入是IOC最普遍的一种实现。App负责创建实例,调用方只需要告诉App需要哪个类的实例就可以了。


Read more...

2016-08-23 Laravel

PHP Composer类自动加载工作原理

composer.json


首先需要了解下Composer的配置文件,在composer.json中,与类加载相关的指令有:

  • require
  • require-dev(root-only)
  • autoload
  • autoload-dev(root-only)
  • include-path
  • target-dir

每个指令在The composer.json Schema中都有说明。

root-only指在我们正在开发的项目中定义了composer.json(里面声明了项目依赖的包等),那么这个项目就是一个根包。require-devautoload-dev只在根包起作用。

require定义了项目依赖的包,这些包会被安装到与composer.json同级的vendor目录下。例如我们的项目A->B、C,而B->D,那么A是根包,B、C、D都会被安装到vendor下。


Read more...

2016-07-20 composer

PHP扩展与Zend扩展区别

本文参考自PHP Wiki: Extensions

数据结构区别


通常在php.ini中,通过extension=*加载的扩展我们称为PHP扩展,通过zend_extension=*加载的扩展我们称为Zend扩展,但从源码的角度来讲,PHP扩展应该称为“模块”(源码中以module命名),而Zend扩展称为“扩展”(源码中以extension命名)。

两者最大的区别在于向引擎注册的钩子。少数的扩展,例如xdebug、opcache,既是PHP扩展,也是Zend扩展,但它们在php.ini中的加载方式得用zend_extension=*,具体原因下文会说明。


Read more...

2016-07-10 PHP扩展

xhprof的实现探讨

最近感兴趣看了下xhprof的内部实现,本文将针对xhprof的各个功能点进行分析。

关键数据结构


xhprof主要只使用了如下两个数据结构:


Read more...

2016-05-02 性能分析

MySQL MHA主库高可用方案学习

环境


  • VMWare 3台虚拟机,CentOS 7
  • MySQL 5.7.12
  • MHA 0.56

安装


MySQL采用RPM包直接装,初始密码为grep 'temporary password' /var/log/mysqld.log。如果需要的话,可以清空/var/lib/mysql目录,然后执行mysqld --initialize重新初始化数据库目录。

MHA源码安装,RPM安装会出问题:Can't locate MHA/NodeConst.pm in @INC。另外需要安装一些perl的依赖:yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager cpan


Read more...

2016-05-02 高可用

ELK入门实践

ELK主要由Elasticsearch、Logstash、Kibana三个软件组成,用于日志的快速搜索和分析。官网地址:elastic

  • Logstash: 将log进行处理后存入Elasticsearch中
  • Elasticsearch: 存储log,建立索引,提供搜素(过滤、聚合),支持横向扩展、高可用
  • Kibana: 将Elasticsearch中存储的log以图表的方式展示出来

由于Kibana现在还没有联合查询的功能,所以本文采用Kibi(Kibana的一个fork增强版本)。

对于ELK的快速入门书籍可查看:ELKstack 中文指南,详细了解的话请参考官方文档。

本文主要讲述了使用ELK进行日志分析的实践,以分析我们开发组开发环境的nginx access log为例子。


Read more...

2016-04-18

swoole_server SWOOLE_PROCESS模式执行探讨

swoole_server的SWOOLE_PROCESS模式是一个比较复杂的运行模式,因为存在了大量的进程间通信,复杂的连接管理等。

其工作模式大致如下图,这里省略掉Manager、Task进程:


Read more...

2016-04-16 swoole