企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
# php 特点 php是解释性语言。和C/C++、Java、C#等语言不同,PHP是一门弱类型语言。 一个变量不是一开始就声明类型,运行中才会显示或隐士的转换。 ***** php是多进程模型,每个请求互不干涉。好处是某个请求挂掉,不会对服务器造成影响。不过现在php也支持多线程模型swoole。 ***** php总共有四大层组成,引擎(Zend)+ 组件(ext) 的模式降低内部耦合。 中间层(sapi) 隔绝web server和PHP。Application 就是我们编写的php代码。 # 四层结构 ## zend 引擎层 (发动机) zend 引擎负责 php 代码 **词法解析** 、**语法分析、编译为可执行的opcode,并实现对应的处理方法。**实现了基本的数据结构,HashTable、OO 。内存的分配管理、api接口调用,都是zend的核心。 Zend引擎中包含了编译器和解释器,从PHP代码到opcode的执行,均由Zend引擎完成。 Zend引擎除了实现了PHP的核心功能,还提供了一套接口,让PHP可以在更多的场景中使用,如命令行环境、Web环境等。 ## ext 服务扩展层 (车轮) ext目录主要是提供各种基础服务,比如内置函数的实现,curl、hash、json、pdo、mysql等等。 ## sapi 服务端通信接口 (公路) Sapi全称是Server Application Programming Interface,也就是服务端应用编程接口。Sapi通过一系列钩子函数和外部服务器交换数据,php-fpm、cgi、cli、apache2handler等接口都是在这个目录实现的。 ## Application 应用程序层 (司机) 我们的代码都是写在了这层,通过不同的sapi方式得到各种各样的应用模式,如通过webserver实现web应用、在命令行下以脚本方式运行等等。 # sapi sapi是服务器和php数据交换的接口。 **apache2handler**:apache作为webserver,采用mod_PHP模式运行时候的处理方式。 **cgi**:这就是大名鼎鼎的fastcgi协议,也是异步webserver所支持的唯一方式。webserver(通常为Apache或Nginx)通过CGI协议把请求传给CGI进程,执行代码将结果返回给webserver,退出进程。 **fpm**:fpm全称为FastCGI Process Manager, PHP官方提供的FastCGI进程管理器。以Nginx服务器为例,当有http协议请求发送到Nginx服务器,Nginx按照FastCGI协议把请求交给php-fpm进程处理。 **cli**:Command Line Interface的简称,PHP的命令行交互接口。 # opcode * php 代码经过**词法分析**器将php代码转换为有意义的标识Token,词法分析器底层使用Re2c实现的。php7版本中有137中token,在zend_language_parser.h中做了定义。php也提供了token_get_all()函数用来获取php代码被切割后的token。 * TOKEN 通过**语法分析**,将一个个的 token 词块组织起来,转换成 AST 抽象语法树。语法分析器主要的作用就是将token和符合文法规则的代码生成抽象语法树,语法分析是基于Bison实现的。语法分析使用了BNF(Backus-NaurForm,巴科斯范式)来表达文法规则,Bison借助状态机、状态转义表和压栈、出栈等一系列操作,生成抽象语法树。PHP-Parser工具,它可以用来查看PHP代码生成的AST。 * 抽象语法树转换为 opcodes,opcodes是opcode的集合形式,是PHP执行过程中的中间代码,类似Java中的字节码。opcode生成之后由虚拟机执行。opcode是php7定义的一组指令标识,不同的指令对应不同的handler(处理函数),以echo语句为例,echo对应的是ZEND_ECHO。借助vld插件,可以直观地看到一段PHP代码生成的opcode。内核在zend_vm_opcodes.h中定义了186种opcodes。 * zend 引擎解析执行 opcodes