PHP模块
内核、zend引擎、扩展层
php内核用来处理请求,文件流,错误处理等相关操作,zend引擎用以将源文件转成机器语言,然后在虚拟机上运行它,扩展层是一组函数,类库和流,PHP使用它们来执行一些特定的操作
PHP的特点
- 多进程模型:不同请求之间互不干涉,一个请求挂掉不会对全盘服务造成影响
- 弱类型语言:变量类型可以发生变化
- 引擎zend+组件ext的模式降低内部耦合
- 中间层sapi隔绝web server和php
PHP从下到上是一个4层体系
- zend引擎:php内核部分,将php代码翻译为可执行的opcode处理,并实现相对应的处理方法,实现了基本的数据结构,内存分配及管理。提供了响应的api方法供外部调用,是一切的核心。
- Extensions:通过组件的方式提供各种基础服务,比如各种内置函数(array系列,string系列),标准库等都是通过extension来实现,用户也可以自己写扩展。
- sapi:服务端应用编程接口。sapi通过一些列钩子函数,使得php可以和外围交互数据,这是php非常优雅和成功的一个设计,通过sapi成功的将php本身和上层应用解耦隔离。
- 上层应用:就是我们平时写的PHP程序,通过不同的sapi方式得到各种各样的应用模式,如通过webserver实现web应用,在命令行下以脚本的方式运行等等。
- 如果PHP是一辆车,那么车的框架就是PHP本身,Zend是车的引擎(发动机),Ext下面的各种组件就是车的轮子,Sapi可以看做是公路,车可以跑在不同类型的公路上,而一次PHP程序的执行就是汽车跑在公路上。因此,我们需要:性能优异的引擎+合适的车轮+正确的跑道。
sapi
- sapi:通过一些列的接口,使得外部应用可以和php交换数据并可以根据不同应用特点实现特定的处理方法
- cgi:又叫通用网关接口,CGI是为了保证web server传递过来的数据是标准格式的一种规范
- Fastcgi:是用来提高CGI程序性能的。
首先,Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是fastcgi的对进程的管理。
- php-fpm: php-fpm的管理对象是php-cgi。但不能说php-fpm是fastcgi进程的管理器,因为前面说了fastcgi是个协议,似乎没有这么个进程存在,就算存在php-fpm也管理不了他(至少目前是)。 有的说,php-fpm是php内核的一个补丁
以前是对的。因为最开始的时候php-fpm没有包含在PHP内核里面,要使用这个功能,需要找到与源码版本相同的php-fpm对内核打补丁,然后再编译。后来PHP内核集成了PHP-FPM之后就方便多了,使用--enalbe-fpm这个编译参数即可。