201411-07 PHP内核探索 —— 从SAPI接口开始 SAPI:ServerApplicationProgrammingInterface服务器端应用编程端口。研究过PHP架构的同学应该知道这个东东的重要性,它提供了一个接口,使得PHP可以和其他应用进行交互数据。本文不会详细介绍每个PHP的SAPI,只是针对最简单的CGISAPI,来说明SAPI的机制。我们先来看看PHP的架构图:SAPI指的是PHP具体应用的编程接口,就像PC一样,无论安装哪些操作系统,只要满足了PC的接口规范都可以在PC上正常运行,PHP脚本要执行有... 继续阅读 >
201411-07 PHP内核探索 —— Zend引擎:Zend引擎是PHP实现的核心 相信很多人都听说过ZendEngine这个名词,也有很多人知道ZendEngine就是PHP语言的核心,但若要问一句:ZendEngine到底存在于何处?或者说,ZendEngine究竟是在什么时候怎么发挥作用让PHP源码输出我们想要的东西的?Zend引擎是PHP实现的核心,提供了语言实现上的基础设施。例如:PHP的语法实现,脚本的编译运行环境,扩展机制以及内存管理等,当然这里的PHP指的是官方的PHP实现(除了官方的实现,目前比较知名的有f... 继续阅读 >
201411-07 PHP内核探索 —— 如何执行PHP脚本:Zend引擎是如何解释PHP脚本的 前面介绍了PHP的生命周期,PHP的SAPI,SAPI处于PHP整个架构较上层,而真正脚本的执行主要由Zend引擎来完成,这一小节我们介绍PHP脚本的执行。目前编程语言可以分为两大类:第一类是像C/C++,.NET,Java之类的编译型语言,它们的共性是:运行之前必须对源代码进行编译,然后运行编译后的目标文件。第二类比如PHP,Javascript,Ruby,Python这些解释型语言,他们都无需经过编译即可“运行”。虽然可以理解为直接运行,... 继续阅读 >
201411-07 PHP内核探索 —— PHP脚本的执行细节:PHP、C、汇编、机器码 众所周知,计算机的CPU只能执行二进制的机器码,每种CPU都有对应的汇编语言,汇编语言编译器将汇编语言翻译成二进制的机器语言,然后CPU开始执行这些机器码。汇编语言作为机器语言与程序设计者之间的一个层,给我们带来了很多方便,程序员不需要用晦涩的01数字来书写程序,当然人们并不满足这样的一个进步,于是在汇编语言之上又多了一个层——C语言,C语言更贴近人类熟悉的“自然语言”,程序设计者可以通过C语言编译器将C源代码... 继续阅读 >
201411-07 PHP内核探索 —— PHP里的opcode:Zend虚拟机中的指令 opcode是计算机指令中的一部分,用于指定要执行的操作,指令的格式和规范由处理器的指令规范指定。除了指令本身以外通常还有指令所需要的操作数,可能有的指令不需要显式的操作数。这些操作数可能是寄存器中的值,堆栈中的值,某块内存的值或者IO端口中的值等等。通常opcode还有另一种称谓:字节码(bytecodes)。例如Java虚拟机(JVM),.NET的通用中间语言(CIL:CommonIntermeditateLanguage)等等。PHP中的opcode则属于前面... 继续阅读 >
201411-07 PHP内核探索 —— 解释器的执行过程:引擎是如何执行PHP代码的 这里将介绍引擎内部执行一个PHP脚本的流程,以CLISAPI为例子来对流程中核心的部分做简单介绍,省去一些初始化及清理操作。CLI(CommandLineInterface)即PHP的命令行模式,现在此SAPI是默认安装的,我们在服务器上安装完PHP之后,一般会生成一个可执行文件,假设此文件为/usr/local/bin/php ,那么我们在SHELL下可以用以下命令来执行一个PHP脚本:/usr/local/bin/php-ftest.php这个命令将执行当前目录下的test.php脚本,我... 继续阅读 >
201411-07 PHP内核探索 —— 理解Zend里的哈希表 在PHP的Zend引擎中,有一个数据结构非常重要,它无处不在,是PHP数据存储的核心,各种常量、变量、函数、类、对象等都用它来组织,这个数据结构就是HashTable。HashTable在通常的数据结构教材中也称作散列表,哈希表。其基本原理比较简单(如果你对其不熟悉,请查阅随便一本数据结构教材或在网上搜索),但PHP的实现有其独特的地方。理解了HashTable的数据存储结构,对我们分析PHP的源代码,特别是ZendEngine中的虚拟机的实现时... 继续阅读 >