nginx

Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。

cgi,fast-cgi

也叫通用网关接口,是Web服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。

早期的webserver只能处理html等静态文件,无法处理动态语言(比如php程序),于是出现了cgi协议,只要按照cgi协议去编写程序,就能实现语言解释器与webwerver的通信。

但是该方法有个缺点,就是webserver每收到一个请求,都会去fork一个cgi进程,请求结束再kill掉这个进程。很明显这很浪费资源。

于是出现了fast-cgi。fast-cgi每次处理完请求后,不会kill掉这个进程,而是保留这个进程,使这个进程可以一次处理多个请求。

php-fpm

全称:php-Fastcgi Process Manager.

php-fpm是 FastCGI 的实现,并提供了进程管理的功能。

进程包含 master 进程和 worker 进程两种进程。

master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。

Nginx + php-fpm

nginx 接收请求,然后通过反向代理功能将动态请求转向后端Php-fpm。具体流程如下:

    请求
     |
    nginx
     |
    加载nginx fast-cgi模块
     |
    fast-cgi监听127.0.0.1:9000地址
     |
    请求到达127.0.0.1:9000
     |
    php-fpm 监听127.0.0.1:9000(master进程)
     |
    php-fpm 接收到请求,启用worker进程处理请求
     |
    php-fpm 处理完请求,返回给nginx
     |
    nginx将结果通过http返回给浏览器
    

nginx 相关命令

  • service nginx start
  • service nginx stop
  • service nginx restart
  • service nginx status
  • nginx -s reload

php-fpm 相关命令

  • service php7.3-fpm start
  • service php7.3-fpm stop
  • service php7.3-fpm restart
  • service php7.3-fpm status
  • php7.3-fpm -s reload

文章参考:

https://zhuanlan.zhihu.com/p/439799459

四大部件

  • router 路由:负责接收请求和发送响应,为Web应用程序提供网页和API接口。
  • controller:响应来自路由器的请求,处理数据并返回对应的视图(View)或数据模型(Model);
  • Model:操作和管理数据的一组类,负责从数据库和其他数据存储中检索数据,进行 CRUD 操作等;
  • Views: 提供给用户的Web界面,包括HTML和CSS样式。

目录结构

app				应用核心目录
bootstrap 		启动目录,用于载入配置文件,中间件等
config			配置文件目录。数据库,文件系统,cache等配置
database		数据库迁移文件以及填充文件
public			对外访问目录。index文件,静态资源等
resource		对应的视图文件以及为编译的前端资源,邮件模板,本地化语言文件
routes			路由目录。包括:web.php,api.php,console.php,changes.php。
storage 		文件存储目录。缓存文件,日志,上传文件
tests 			测试目录。自动化的测试脚本
Vendor			包含了应用通过composer 加载的依赖

这里只展示跟目录。具体参考:
https://laravelacademy.org/post/21960

请求原理

路由 => 中间件 => 控制器 => 模型 => 控制器 => 视图

  • 路由接受请求,检测是否有中间件,如果有中间件,先进入中间件做数据处理。比如登录,日志,频次检测;
  • 如果没有中间件或者中间件检测没问题后,据配置的路由规则,将请求交给控制器;
  • 控制器做一些参数之类的检查,如果需要调用数据,则调用相关模型获取数据;
  • 控制器将处理号的数据反馈给视图。

通常控制器做处理数据,有点臃肿和庞大,中间可以件一些Sevice层,专门封装相关业务处理。控制器只负责和调用这些封装好的对象。这样做更符合设计原则。




hashtable:将不同的关键字(key)通过映射函数计算得到散列值(Bucket->h) 从而直接索引到对应的Bucket

hash表保存当前循环的指针,所以foreach 比for更快

Bucket:保存数组元素的key和value,以及散列值