Php 体系结构及其执行概述

http://blog.csdn.net/xming4321/article/details/6863458


php采用的是典型的模块化,分层的思想。方便扩展和维护。 从上到下一次为:

一、sapi
       Server Application Programming Interface (sapi)服务端应用编程端口.

       看似很高深的概念,其实说白了就是这样一个东西,服务器程序(例如:apache,ngnix)和外围程序定义了一个约定,说咱们提供几个函数,他们的函数名称是xxx 参数是xxx 然后我们之间就可以正常调用(例如php,例如asp或者一些服务器的插件)。例如如果是在linux下与apache通讯 则就是调用的apache_2.x.so
 
二、php 扩展组件
    为php提供扩展功能的一些组件,例如我们常用的mysql驱动,加密加密解密组建 。这些组件为php提供了一些扩展功能。在php中我们可以通过函数调用的形式调用他们。

三、php层
       负责与sapi层交互控制整个php运行的流程。其实也就是说调用扩展和zend核心。同时也包括文件处理等一些php核心部分。

四、zend引擎
       php的核心实现,实现php的编译过程(词法分析,语法分析,语义分析等) 生成opcode, 执行opcode。其实就是个编译器加虚拟机。


Php的执行分两种情况,一种命令行执行方式,一种php网页执行方式


 命令行执行时候:
      首先会初始化一些环境,包括加载配置文件,加载扩展组件等。其次调用zend核心引擎生成opcode。然后执行此opcode,执行过程中如果遇到调用扩展函数,则调用相应的扩展组件入口函数。
最后执行完毕,清理现场,包括释放内存等。

网页的执行:(以apache为例)

      有两种模式这是通过apache来配置的。一种是module模式。此模式中,当apache启动时候,会加载一个php模块,创建php处理进程,等待请求。当apache收到一个请求php页面的请求时候(这里是指最终定位的资源是php文件,对于采取了url重写你请求的可能是.html但是最终执行的却是.php文件也算在内)则会调用php进程去处理,其处理流程和命令行下相同,处理完毕则返回输出结果给apache,apache负责向客户端返回http应答。
      
      一种模式是cgi模式。cgi模式不预先加载php模块,而是每次请求则产生一个php进程。通过消息发送给php进程处理,处理完毕后返回给apapche。

===============

php 源码文件结构:

  • /这个目录包含的东西比较多,主要包含一些说明文件以及设计方案。其实项目中的这些README文件是非常值得阅读的例如:

    • /README.PHP4-TO-PHP5-THIN-CHANGES这个文件就详细列举了PHP4PHP5的一些差异。

    • 还有有一个比较重要的文件/CODING_STANDARDS,如果要想写PHP扩展的话,这个文件一定要阅读一下,不管你个人的代码风格是什么样,怎么样使用缩进和花括号,既然来到了这样一个团体里就应该去适应这样的规范,这样在阅读代码或者别人阅读你的代码是都会更轻松。

  • build顾名思义,这里主要放置一些和源码编译相关的一些文件,比如开始构建之前的buildconf脚本等文件,还有一些检查环境的脚本等。

  • ext官方扩展目录,包括了绝大多数PHP的函数的定义和实现,如array系列,pdo系列,spl系列等函数的实现,都在这个目录中。个人写的扩展在测试时也可以放到这个目录,方便测试和调试。

  • main这里存放的就是PHP最为核心的文件了,主要实现PHP的基本设施,这里和Zend引擎不一样,Zend引擎主要实现语言最核心的语言运行环境。

  • ZendZend引擎的实现目录,比如脚本的词法语法解析,opcode的执行以及扩展机制的实现等等。

  • pear“PHP扩展与应用仓库”,包含PEAR的核心文件。

  • sapi包含了各种服务器抽象层的代码,例如apachemod_phpcgifastcgi以及fpm等等接口。

  • TSRMPHP的线程安全是构建在TSRM库之上的,PHP实现中常见的*G宏通常是对TSRM的封装,TSRM(ThreadSafe Resource Manager)线程安全资源管理器。

  • testsPHP的测试脚本集合,包含PHP各项功能的测试文件

  • win32这个目录主要包括Windows平台相关的一些实现,比如sokcet的实现在Windows下和*Nix平台就不太一样,同时也包括了Windows下编译PHP相关的脚本。

===============

采用模块方式运行php,在apache的配置文件中需要添加

LoadModulephp5_module /usr/lib/apache2/modules/libphp5.so

===============

php模块被启动了。现在到请求php了文件了。
由这个函数来处理 static int php_handler(request_rec *r)

这这个函数 做的就是做些判断什么的,先跳过。其实重要的是他执行了 这个函数php_execute_script(&zfd TSRMLS_CC); 这个在main.c 呵呵 终于到主函数了。此函数也是做了些判断和初始化

重要的是执行这个函数zend_execute_scripts(ZEND_REQUIRE TSRMLS_CC, NULL, 3, prepend_file_p, primary_file, append_file_p)这个在zend/zend.c 文件中 到zend核心了。

此函数中间有zend_compile_file(file_handle, type TSRMLS_CC);这里会做自发分析和语法分析然后返回的是一个 opcode_array即 一个字节码数组

然后这个字节码数组被执行zend_execute(EG(active_op_array) TSRMLS_CC);其实就是调用虚拟机,执行字节码执行过程就完毕。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值