PHP给人的第一感觉它是一种脚本语言,同时它又可以跨平台,它是咋样完成跨平台的?作为脚本语言的PHP对其描述是否够精确?我们接下来了解一下。代码的大致执行过程如下图所示:
PHP代码执行图解PHP的大致执行过程是这样的。PHP代码是不能直接运行的,首先需要经过词法分析器分析、语法分析,在经过编译器编译成opcode中间件,可能看到这里有的人会奇怪,PHP还能编译呀?其实严格来说,PHP是一种编译语言。编译成了opcode,一个中间码。类似JAVA中的class文件。在由zend执行引擎上执行它的opcode,从这点上来说,它是一个先编译后执行的语言。
PHP底层分析之编译特点对于编译型语言如C语言,C++等,都是先编译成机器码(二进制)来运行的。JAVA语言,是把JAVA编译成class,称为bytecode的字节码,在由JVM来运行的。JVM相当于在操作系统弄个层面又架了一层软件模拟的机器。为什么JAVA跨平台?其实JAVA本身是不跨平台的,真正跨平台的是JVM,而JAVA运行在JVM上,所以我们通常认为JAVA可以跨平台。
PHP执行流程架构图对于解释语言,是由解释器来解释执行的,典型的如linuxshell,解释器逐行来执行命令。
PHP稍微有些特殊之处。虽然是一个脚本语言,但不是靠解释器解释的。而是zend虚拟机屏蔽了操作系统的区别来实现跨平台执行的。PHP代码编译成opcode,由zend虚拟机来执行opcode。
对于JAVA语言而言,通过编译后的二进制文件,可以直接打包发布。但是PHP就不行了。PHP的opcode在PHP脚本一结束,就清除了。下次执行重新生成opcode。那么鉴于这种情况,opcode能否作为缓存来用呢?Php本身不支持,但是apc、xcache等第三方工具加速器实现了对opcode的重复利用。
以上就是PHP大致的一个编译过程。