PHP运行模式

php常见的运行模式有4种:

一:cgi 协议模式
cgi模式 通用网关接口(Common Gateway Interface),它允许web服务器通过特定的协议与应用程序通信, 调用原理大概为:
用户请求->Web服务器接收请求->fork子进程 调用程序/执行程序->程序返回内容/程序调用结束->web服务器接收内容->返回给用户 由于每次用户请求,都得fork创建进程调用一次程序,然后销毁进程,所以性能较低

二:fast-cgi 协议模式(就是常用的PHP-FPM)
fast-cgi是cgi模式的升级版,它像是一个常驻型的cgi,只要开启后,就可一直处理请求,不再需要结束进程, 调用原理大概为:
web服务器fast-cgi进程管理器初始化->预先fork n个进程
用户请求->web服务器接收请求->交给fast-cgi进程管理器->fast-cgi进程管理区接收,给其中一个空闲fast-cgi进程处理->处理完成,fast-cgi进程变为空闲状态,等待下次请求->web服务器接收内容->返回给用户

注意,fast-cgi和cgi都是一种协议,开启的进程是单独实现该协议的进程

三:模块模式
apache+php运行时,默认使用的是模块模式,它把php作为apache的模块随apache启动而启动,接收到用户请求时则直接通过调用mod_php模块进行处理

四:php-cli模式(Swoole 运行模式)
php-cli模式属于命令行模式,对于很多刚开始学php就开始wamp,wnmp的开发者来说是最陌生的一种运行模式
该模式不需要借助其他程序,直接输入php xx.php 就能执行php代码
命令行模式和常规web模式明显不一样的是:

没有超时时间
默认关闭buffer缓冲
STDIN和STDOUT标准输入/输出/错误 的使用
echo var_dump,phpinfo等输出直接输出到控制台
可使用的类/函数 不同
php.ini配置的不同

PHP 架构

如图:
在这里插入图片描述
一:Zend 引擎
Zend 引擎是 PHP4 以后加入 PHP 的,是对原有PHP解释器的重写,整体使用 C 语言进行开发,也就是说可以把PHP理解成用C写的一个编程语言软件,引擎的作用是将PHP代码翻译为一种叫opcode的中间语言,它类似于JAVA的ByteCode(字节码)。
引擎对PHP代码会执行四个步骤:

1:词法分析 Scanning(Lexing),将 PHP 代码转换为语言片段(Tokens)。
2:解析 Parsing, 将 Tokens 转换成简单而有意义的表达式。
3:编译 Compilation,将表达式编译成Opcode,一般时一条条的指令,最终调用底层C语言的方法。
4:执行 Execution,顺序执行Opcode,每次一条,以实现PHP代码所表达的功能。
APC、Opchche 这些扩展可以将Opcode缓存以加速PHP应用的运行速度,使用它们就可以在请求再次来临时省略前三步。
引擎也实现了基本的数据结构、内存分配及管理,提供了相应的API方法供外部调用。

二:Extensions 扩展
常见的内置函数、标准库都是通过extension来实现的,这些叫做PHP的核心扩展,PHP代码被编译成 Opcode字节码最后会逐条调用对应的c语言方法执行,PHP语言简单的理解就是c语言写的一个软件,做的主要工作就是将PHP 语法翻译成C语言指令并调用;用户也可以根据自己的要求编写或者安装自己的PHP的扩展。

三:SAPI
SAPI 是 Server Application Programming Interface 的缩写,中文为服务端应用编程接口,它通过一系列钩子函数使得PHP可以和外围交换数据,SAPI 就是 PHP 和外部环境的代理器,它把外部环境抽象后,为内部的PHP提供一套固定的,统一的接口,使得 PHP 自身实现能够不受错综复杂的外部环境影响,保持一定的独立性。
通过 SAPI 的解耦,PHP 可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。

四:上层应用
程序员编写的PHP程序,无论是 Web 应用还是 Cli 方式运行的应用都是上层应用,PHP 程序员主要工作就是编写它们。

总结
当你理解这些后你就会理解为什么PHP的创始人会说PHP开发其实是不需要框架的,因为PHP的设计本身就是一个类似框架的东西,如果用汽车比喻的话PHP本身就是就是车的骨架,Zend的是引擎,Ext是轮子,方向盘等车的组件,SAPI 就是路。

基础概念

一:脚本语言:
脚本语言相对的就是预编译语言如 java,c++等而言的;
脚本语言部署运行不需要预先编译,而是每次执行时及时编译成对应字节码后执行(可以用缓存保存编译后的字节码),这就是为什么脚本语言执行效率相对会低的原因之一

二:写时复制:
当修改一个变量属性值,并且这个变量同时还被其他变量引用,这时php会复制一个新的对象交给要修改的变量;
eg:

$a=new User();
$b=$a //这里b跟a指向相同的内存地址
$b.name='张三'; //这里修改b的属性不会修改到a的熟悉,php会先复制一个新对象再修改

三:引用计数:
php变量底层是C语言的结构体,里面会有引用计数,每被其他变量引用一次则加1,取消则减1直到引用计数为0 则会被回收

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐