语言有静态语言和动态语言之分,静态语言一般指先编译后执行,动态语言一般只边解释边执行。静态语言包括c,c++,Java等,动态语言有PHP,JavaScript,Python等。
任何语言都可以设计成动态或者静态,只是因为应用领域和需求不同而有了分别。编译型语言一次编译处处运行,更强调的是执行速度。而动态语言即时编写即时运行,更关注的是灵活。语言没有优劣,优劣的是一用语言的人。
跟开发语言相关的只是是编译原理,大家了解一下就行,编译语言一般的过程有词法分析,语法分析,语法编译,生成中间码,存储管理,优化等。 词法分析的过程会去除所有空格以及注释,所以这些都不会影响程序执行效率。
顺便说一下php的APC(纳入PHP扩展),XCODE,EACCELERATOR优化,这三款都是php加速器。通常情况下php的执行每一次都会有编译成中间码(OPCODE)的过程,而为了提高php的执行效率,加速器的原理就是缓存OPCODE,使得php程序只有第一次的时候进行编译,以后每一次执行直接执行中间码。(缓存是个非常重要的概念,比如模板编译,静态生成,文件缓存,数据库缓存,memcache,nginx反向代理等)
下面说一下php语言本身的架构,如图:
一般考虑php组成主要简化分为3大块,php内核,Zend引擎,扩展层:
PHP内核用来处理请求、文件流、错误处理等相关操作;
Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;
扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们需要MySQL扩展来连接mysql数据库; 当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;最后,ZE将程序运行结果返回给PHP内核,它再将结果传送给SAPI层,最终输出到浏览器上。
Php外部通用通信接口SAPI简介:
SAPI指的是PHP具体应用的编程接口, 就像PC一样,无论安装哪些操作系统,只要满足了PC的接口规范都可以在PC上正常运行, PHP脚本要执行有很多种方式,通过Web服务器,或者直接在命令行下,也可以嵌入在其他程序中。
通常,我们使用Apache或者Nginx这类Web服务器来测试PHP脚本,或者在命令行下通过PHP解释器程序来执行。 脚本执行完后,Web服务器应答,浏览器显示应答信息,或者在命令行标准输出上显示内容。
我们很少关心PHP解释器在哪里。虽然通过Web服务器和命令行程序执行脚本看起来很不一样, 实际上它们的工作流程是一样的。命令行参数传递给PHP解释器要执行的脚本, 相当于通过url请求一个PHP页面。脚本执行完成后返回响应结果,只不过命令行的响应结果是显示在终端上。
脚本执行的开始都是以SAPI接口实现开始的。只是不同的SAPI接口实现会完成他们特定的工作,例如Apache的mod_php SAPI实现需要初始化从Apache获取的一些信息,在输出内容是将内容返回给Apache,其他的SAPI实现也类似。
脚本执行的开始都是以SAPI接口实现开始的。只是不同的SAPI接口实现会完成他们特定的工作,例如Apache的mod_php SAPI实现需要初始化从Apache获取的一些信息,在输出内容是将内容返回给Apache,其他的SAPI实现也类似。
MINIT apache启动的整个生命周期或者命令行的执行过程中,只执行一次
RINIT 脚本被请求是激活模块
RSHUTDOWN 请求结束,或者脚本结束是运行。 Eg:可以记录运行时间
MSHUTDOWN SAPI生命周期结束时执行。
单进程请求
通常PHP是编译为apache的一个模块来处理PHP请求。Apache一般会采用多进程模式, Apache启动后会fork出多个子进程,每个进程的内存空间独立,每个子进程都会经过开始和结束环节,不过每个进程的开始阶段只在进程fork出来以来后进行,在整个进程的生命周期内可能会处理多个请求。只有在Apache关闭或者进程被结束之后才会进行关闭阶段,在这两个阶段之间会随着每个请求重复请求开始-请求关闭的环节
多进程请求