分类 PHP 下的文章

SlimPHP框架运行原理

SlimPHP主要有两个大的部分,路由(Router)部分和中间件(Middleware)部分。
首先,我们需要了解的是路由部分。
其实路由部分没什么难度,Route对象主要存储的是来自map()方法的内容。
Router是一个控制器,所有对Route的操作都要经手Router,职责有创建Route对象和dispatch(Request)到匹配的Route。
匹配的Route将会被放到Request里面,Route中的Closure(其中有业务逻辑代码)在中间件部分执行。

然后,我们来了解一下中间件部分。
所有中间件会形成一个栈(stack)结构,从最外层的中间件到最里层的中间件依次执行。
当然,最里层的中间件会继续调用$next,那么这个$next是何方神圣呢?
其实这个$next就是App对象,在PHP中,有一个魔术方法__invoke()可以把一个对象当成函数来用。
这边的App类就有一个__invoke()方法,当调用到最里层的中间件的时候,就相当于会调用$app($request, $response)。
在这个__invoke()方法里面,将会调用路由部分存储在Request中的Route中携带的Closure业务逻辑。
具体怎么执行的,请查看相关代码。

差不多就这些内容。

PHP的页面控制器和前端控制器

读过《企业应用架构模式》(一本归纳总结了企业应用开发中的架构和模式的书)的读者都会知道书中提到过两种对立的模式,页面控制器和前端控制器模式,那么这两种模式有什么区别呢?

页面控制器和前端控制器模式的区别在于前端请求的地址不同,前端控制器是只有一个请求地址,而页面控制器是请求多个地址。而这造成了两种模式的本质区别,那就是需不需要路由。

在PHP中,我们初学这门语言的时候,大多是从页面脚本入门,这时候使用的就是PHP的页面控制器模式。而在框架中,我们需要切换到前端控制器模式,理解路由的概念。

在前端控制器模式中,路径参数有url字符串,url参数,request method。
而在页面控制器中,不同文件本身就是一种路径参数,当然除此之外可以叠加上诉的url字符串等其他参数。

所以,前端控制器模式中,路由分发实现是由一个路由分发器来进行dispatch。
而在页面控制器中,路由分发实现不仅通过用户请求不同文件,而且需要在文件中进行进一步的分发来实现。

后面,我会改造Slimphp框架成为页面控制器模式的版本,未完待续。

安装php-fpm和nginx

以前一直用Apache Httpd和mod_php的组合的,现在来了解一下nginx+php-fpm的组合。

安装参考了这个网页:https://www.sitepoint.com/setting-up-php-behind-nginx-with-fastcgi/

除了存在默认的localhost的站点外,我还新建了一个站点,贴一下diff(diff sites-enabled/nginx.zhudekui.com sites-enabled/default)的内容。

< listen 80;
< #listen [::]:80 default_server ipv6only=on;


  listen 80 default_server;
  listen [::]:80 default_server ipv6only=on;

24c24
< root /var/www/html;


  root /usr/share/nginx/html;

28c28
< server_name nginx.zhudekui.com;


  server_name localhost;

54,55c54,55
< location ~ .php$ {
< fastcgi_split_path_info ^(.+.php)(/.+)$;


  #location ~ \.php$ {
  #       fastcgi_split_path_info ^(.+\.php)(/.+)$;

61,64c61,64
< fastcgi_pass unix:/var/run/php5-fpm.sock;
< fastcgi_index index.php;
< include fastcgi_params;
< }


  #       fastcgi_pass unix:/var/run/php5-fpm.sock;
  #       fastcgi_index index.php;
  #       include fastcgi_params;
  #}

此外,还了解了一下FastCGI:
在CGI的时代,每个请求都是由CGI创建一个process(进程),而且会在完成后销毁。
要知道,虽然*nix的创建销process的开销比Windows好很多,但是还是比较weight,这导致网站并发量很难提高。
而FastCGI,有点类似于进程池的概念,FastCGI将多个线程不断重用,基本没有了创建销毁process的开销。

Symfony Book

第一章:Symfony和HTTP基础

HTTP很简单

  • 客户端发送了一个请求
  • 服务器返回了一个响应
  • 请求,响应和Web开发

PHP中的请求和响应

Symfony中的请求和响应

请求到响应的过程

  • 前端控制器
  • 保持井然有序
  • Symfony应用流程
  • A Symfony Request in Action

Symfony: Build your App, not your Tools

  • Standalone Tools: The Symfony Components
  • The Full Solution: The symfony Framework

第二章: Symfony 对比 纯PHP

一个纯PHP搭建的blog

  • 分离出表现层
  • 分离出应用(领域)逻辑
  • 分离出模板

添加一个博客“展示”页面

A "Front Controller" to the Rescue

  • 创建前端控制器
  • Add a Touch of Symfony
  • The Sample Application in Symfony
  • Where Symfony Delivers

更好的模板


第三章: 安装和配置Symfony

安装“Symfony安装器”

  • Linux and Mac OS X 系统
  • Windows 系统

创建Symfony应用

  • 在一个特定版本的Symfony上搭建你的项目

不使用安装器创建Symfony应用

  • 全局安装Composer
  • 通过Composer创建一个Symfony应用

运行Symfony应用

检查Symfony应用的配置和安装

升级Symfony应用

安装Symfony Demo应用

  • 安装一个Symfony发行版

使用源码控制

  • Checking out a versioned Symfony Application

开始开发


第四章:创建你第一个Symfony页面

创建一个页面:路由和控制器

  • 创建一个JSON响应

动态URL模式:/lucky/member/{count}

渲染一个模板(使用服务容器)

  • 使用一个模板服务
  • 创建模板

探索项目

应用配置

下一个是什么?