PHP基础架构

一、PHP简介

  PHP是一种非常流行的高级脚本语言,尤其适合Web开发,快速、灵活和实用是PHP最重要的特点。PHP自1995年由Lerdorf创建以来,在全球得到了非常广泛的应用。

二、PHP的特性

PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法,丰富的语法支持、同时支持面向对象、面向过程,相比C、Java等语言具有语法简洁、使用灵活、开发效率高、容易学习等特点。

开源免费:PHP社群有大量活跃的开发者贡献代码

快捷:程序开发快,运行快,技术本身学习快,实用性强

效率高:PHP消耗相当少的系统资源,自动gc机制

类库资源:有大量可用类库供开发者使用

扩展性:允许用户使用C/C++扩展PHP

跨平台:可以在unix、windows、max os等系统上面使用PHP。

三、PHP的构成   

  PHP源码主要由几个目录:SAPI、main、Zend、exe,其中SAPI是应用接口层,main为PHP主要代码(主要是输入/输出、Web通讯,框架的初始化等,如:fastcgi协议解析,扩展加载,配置解析等)它位于ZendVM之上。

  1. SAPI

PHP本身可以理解为是一个库函数,提供语言的编译与执行服务,它有标准的输入、输出,而SAPI(理解为一个适配器)是PHP的接入层,它接收用户的请求,然后调用PHP内核提供的一些接口完成PHP脚本的执行。SAPI可以认为是PHP的宿主环境,SAPI也是整个PHP框架最外层的一部分。PHP中常用的SAPI三种典型有Cli(命令行执行PHP脚本)、php-fpm(web环境使用PHP的实现)以及Embed(第三发应用嵌入PHP)。

  2. ZendVM

ZendVM是一个虚拟的计算机,介于PHP应用与实际计算机中间,我们编写的PHP代码就是被他解释执行的,它是PHP语言的核心实现,主要由编译器和执行器组成。

其中编译器负责将PHP代码解释为执行器可识别的指令,执行器负责执行编译器解释出来的指令。

  3. Extension

扩展是PHP内核提供的一套扩充PHP功能的一种方式。

四、PHP的生命周期

  

  通过以上图片可以得知,PHP生命周期划分为了五个阶段:

  1. 模块初始化阶段php_module_start()

  这个阶段主要是进行PHP框架、Zend引擎的初始化操作。该阶段一般只在SAPI启动先执行一次,对于Fpm而言,就是在Master进程启动时执行的。

激活SAPI:sapi_activate(),初始化请求信息SG(request_info)、设置POST请求的handler等,在module startup阶段处理完成后将调用sapi_deactivate();

启动PHP输出:php_output_startup();

初始化垃圾回收器:gc_globals_ctor(), 分配zend_gc_globals 内存;

启动Zend引擎;

注册PHP定义的常量:PHP_VERSION、PHP_ZTS、PHP_SAPI……

解析php.ini:解析完成后所有的php.ini配置保存在configguration_hash 哈希表中。

映射PHP、Zend核心的php.ini配置:根据解析出的php.ini,获取对应的配置值,将最终的配置插入EG(ini_directives)哈希表中。

注册用于获取$_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_REQUEST, $_FILES变量的handler;

注册静态编译的扩展:php_register_internal_extensions_func();

注册动态加载的扩展:php_ini_register_extensions,将php.ini中配置的扩展加载到PHP中。

回调各扩展定义的module starup钩子函数,即通过PHP_MINIT_FUNCTION()定义的函数。

注册php.ini 中禁用的函数、类:disable_functions、disable_classes;

  2. 请求初始化阶段php_request_startup()

该阶段每个请求都会经历的一个阶段,对于Fpm而言,在worker进程accept一个请求且读取、解析完请求数据后的一个阶段。主要有:

激活输出:php_output_activate()。

激活Zend引擎:zend_activate():

重置垃圾回收器:gc_reset();

初始化编译器:init_compiler();

初始化执行器:init_executor();

初始化词法扫描器:startup_scanner();

激活SAPI:sapi_actiate()

回调各扩展定义的request startup 钩子函数:zend_activate_modules();

  3. 执行脚本阶段php_execute_script()

该阶段包括PHP代码的编译、执行两个核心阶段。

  4. 请求关闭阶段php_request_shutdonw()

    这个阶段将flush输出内容、发送HTTP应答header头,清理全局变量,关闭编译器,关闭执行器等。另外该阶段还要回调各扩展的request shutdown 钩子函数。

  5. 模块关闭阶段php_module_shutdown()

    该阶段主要进行资源清理,PHP各模块关闭操作。

PHP基础架构的更多相关文章

  1. MVP社区巡讲-云端基础架构:12月5日北京站 12月12日上海站

    紧跟当今的技术发展趋势还远远不够,我们要引领变革!加入本地技术专家社区,获取真实案例.实况培训演示以及探讨新一代解决方案.在此活动中,您将: 了解如何运用开源(OSS)技术.Microsoft 技术及 ...

  2. IT基础架构规划方案一(网络系统规划)

    背景                   某集团经过多年的经营,公司业务和规模在不断发展,公司管理层和IT部门也认识到通过信息化手段可以更好地支撑公司业务运营.提高企业生产和管理效率.同时随着新建办公 ...

  3. IT基础架构规划方案二(计算机系统与机房规划规划)

    计算机系统规划       服务器硬件选型规划方案       根据对某集团的实际调研,获取了企业业务应用系统的建设情况,随着企业信息化建设的推进,需要对各种信息化管理系统和应用系统的服务器选型进行选 ...

  4. IT基础架构规划方案三(IT基础软件和系统规划)

    IT基础软件和系统规划 操作系统选型规划方案 根据对某集团的实际调研,获取了企业业务应用系统的建设情况,随着企业信息化建设的推进,需要对各种信息化管理系统和应用系统的服务器选型进行选型规划,根据不同的 ...

  5. IT基础架构规划方案之实际网络设计案例

    根据某集团总部新办公大楼.厂房和分支机构(店面)的情况,以及IT部门对网络节点数.网络应用和分支机构(店面)的初步规划,对企业的总体网络拓扑结构进行设计,如下图. 设备选型和部署参考: 类型 设备选型 ...

  6. [翻译]用 Puppet 搭建易管理的服务器基础架构(4)

    我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第四部分. 原文地址:http://blog.jobbole.com/89214/ 本文由 伯乐在线 - Wing 翻译,黄利民 校稿 ...

  7. [翻译]用 Puppet 搭建易管理的服务器基础架构(3)

    我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第三部分. 本文由 伯乐在线 - Wing 翻译,黄利民 校稿.未经许可,禁止转载!英文出处:Manuel Kiessling.欢迎加 ...

  8. [Search Engine] 搜索引擎分类和基础架构概述

    大家一定不会多搜索引擎感到陌生,搜索引擎是互联网发展的最直接的产物,它可以帮助我们从海量的互联网资料中找到我们查询的内容,也是我们日常学习.工作和娱乐不可或缺的查询工具.之前本人也是经常使用Googl ...

  9. 移动互联网实战--Web Restful API设计和基础架构

    前言: 在移动互联网的大潮中, Web Restful API逐渐成为Web Server重要的一个分支. 移动端和服务端的交互, 主流的方式还是通过Http协议的形式来进行. 请求以Get/Post ...

  10. 面向服务体系架构(SOA)和数据仓库(DW)的思考基于 IBM 产品体系搭建基于 SOA 和 DW 的企业基础架构平台

    面向服务体系架构(SOA)和数据仓库(DW)的思考 基于 IBM 产品体系搭建基于 SOA 和 DW 的企业基础架构平台 当前业界对面向服务体系架构(SOA)和数据仓库(Data Warehouse, ...

随机推荐

  1. redis安装--集群

    redis在3.0之后开始支持集群,实际生产中一般也是会部署集群了 redis官方推出了一个叫redis-trib.rb的redis集群工具(存放在源码文件的src目录下):由于redis-trib. ...

  2. df命令详解

    1.简介: df命令作用是列出文件系统的整体磁盘空间使用情况.可以用来查看磁盘已被使用多少空间和还剩余多少空间. df命令显示系统中包含每个文件名参数的磁盘使用情况,如果没有文件名参数,则显示所有当前 ...

  3. Linux下NFS的搭建与配置

    一.简介 1.NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布. 2.NFS可实现Linux系统之间的文件 ...

  4. Javascript面试题收集

    第一部分“ 来源: http://bbs.miaov.com/forum.php?mod=viewthread&tid=6974 1.var a = b = 1; ——这样定义变量的隐患 fu ...

  5. Unity与安卓IOS交互

    记录下  安卓与Unity交互中  跳坑  找到的资料. <1>建立交互 http://blog.csdn.net/lizhengwei1989/article/details/54631 ...

  6. Windows 10同步时间的方法

    今天在安装了Windows 10 1809(October 2018 update)之后发现时间不能同步,以前并没有出现这种情况. 1) 打开控制面板,找到时钟域地区 2) 选择日期和时间 3) 选择 ...

  7. Python设计模式 - UML - 部署图(Deployment Diagram)

    简介 部署图也称配置图,用来显示系统中硬件和软件的物理架构.从中可以了解到软件和硬件组件之间的物理拓扑.连接关系以及处理节点的分布情况. 部署图建模步骤 - 找出需要进行部署的各类节点,如网络硬件设备 ...

  8. java项目测试或者不使用request,如何获取webroot路径

    1.使用jdk中的方法,然后根据项目编译后的文件存在的位置,获取到classes目录,然后向上级查询获取String path = EngineTest.class.getResource(" ...

  9. Java中CountDownLatch和CyclicBarrier

    Java编程思想中的例子import javax.validation.constraints.Size; import java.util.Random; import java.util.conc ...

  10. python note 01 计算机基础与变量

    1.计算机基础. 2.python历史. 宏观上:python2 与 python3 区别: python2 源码不标准,混乱,重复代码太多, python3 统一 标准,去除重复代码. 3.pyth ...