PHP5.3内核之整体概览

接触PHP开发也5年多了,有时候很好奇我们写的PHP代码到底是怎么执行的。都说PHP底层是用C写的。那到底是怎么用静态C语言实现动态的PHP语言的呢?

前段时间也分享了一个关于PHP5.3内核的入门研究PPT。鉴于分享内容比较多,会拆分成几篇文章来逐步研究。

一直以来PHP内核对我来说就是一个黑盒的存在,将PHP代码交给内核去执行,返回自己预期的结果。前段时间对PHP内核开始了逐步的分析。

从GitHub上Clone了php-src的源码库。切换到分支PHP-5.3。PHP的整体目录结构如下:

自己去阅读了TIPI的相关文档 http://www.php-internals.com/book/

整体PHP内核的整体功能流程可以简单概括为:词法分析,语法分析和Zend引擎。

PHP内核处理过程中:

  1. 首先将PHP代码进行词法分析,切分成一个个Token片段,最开始PHP1.0词法分析都是手工自己写的,PHP3.0采用了Flex作为词法分析器,后来改成了re2c,一个处理正则更高效的词法分析器。
  2. 对于切分的Token,然后运用了语法分析其Bison进行语法分析,生成Opcode。Bison是一个开源版本的类Yacc语法分线器。
  3. Opcode是PHP中一个重要的数据结构,它是PHP内核能够处理的中间态的操作代码。样子基本类似汇编语言,不过Opcode的执行主要依赖于Zend Engine去执行。PHP5.3的Opcode操作有172种,也就是说所有的PHP代码,最终都会转换成这些Opcode操作,是不是有些神奇。
  4. 然后就是由Zend引擎不停的去执行这些Opcode,将最终执行结果返回。

其实再往深入研究Zend虚拟机结构又可以再进一步细分。

有了整体的内核结构的印象,就可以逐步细致的开始研究PHP内核源码。

另外,研究PHP内核也不得不提的就是PHP的生命周期,分析了一个单进程SAPI生命周期。

PHP的生命周期,简单概括为模块初始化(MINIT)、请求初始化(RINIT)、执行PHP代码、请求结束处理(RSHUTDOWN)、模块结束处理(MSHUTDOWN)。对于多线程的PHP处理请求的情况,模块初始化只有一次,请求的初始化则发生在每次请求开始。

 

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>