php的一些基本概念梳理

楼主是个刚参加工作的菜鸟,这几天刚开通博客园微博,想通过这个平台与大家共同学习与分享一些技术知识。

但是楼主犹豫的好久,不知道第一篇该写点什么。最后我决定先从php的一些基本概念开始,以便加深对各个概念的初步认识。

出于这个动机,我阅读了一些资料,并做了一个算是学习总结,从而有了这篇处女博客。

1php是编译型还是解释型

这看似是一个简单问题,要回答清楚这个问题,却不是一件简单的事。必须先搞清楚什么是编译型,什么是解释型。

翻译

计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。翻译的方式有两种,一个是编译,一个是解释。

编译

型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件)

解释

解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译,比如解释性basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次。

分类

Java是先通过编译器编译成Java Bytecode(java 字节码),然后在运行时通过解释器将Bytecode解释成机器码;

C#是先通过编译器将C#代码编译成Microsoft Intermediate Language(微软中间码),然后通过CLR将IL编译成机器代码;

Php(4.0以后),是先通过zend engine (ze)编译成op code中间代码,然后在执行阶段ze解释并执行编译阶段产生的op code。

所以严格来说Java和Php是一种先编译后解释的语言,而C#是一门纯编译语言,且需要编译两次。

多说两句,为什么C#要编译两次,我们都知道C#是.NET的托管代码。.NET托管代码如C#、VB.NET写成的代码,都是先被编译成中间语言(IL,Intermediate Language,在运行时,再由即时编译器(JIT,Just-In-Time)编译成本机代码。

JIT

JIT是just in time,即时编译技术。使用该技术,能够加速二次翻译的程序的执行速度。 JIT会把翻译过的机器码保存起来,已备下次使用,因此从理论上来说,采用该JIT技术可以,可以接近以前纯编译技术。

目前C#和java都支持JIT,php对JIT的支持如何?HHVM 是 Facebook 开发的高性能 Facebook发布全新JIT PHP虚拟机,宣称比官方的快9倍。楼主碰巧看到,没有做深入了解http://www.oschina.net/news/50112/how-hhvm-improve-php-performance?p=2

JIT的工作原理图 (java)

java jit编译器,业界首先开发出JIT(just in time)编译器。当Java执行runtime环境时,每遇到一个新的类(class),类是Java程序中的功能群组-JIT编译器在此时就会针对这个类进行编译(compile)作业。经过编译后的程序,被优化成相当精简的二进制,这种程序的执行速度相当快。花费少许的编译时间来节省稍后相当长的执行时间,JIT这种设计的确增加不少效率,但是它并未达到最顶尖的效能,因为某些极少执行到的Java指令在编译时所额外花费的时间可能比转译器在执行时的时间还长,针对这些指令而言,整体花费的时间并没有减少。

基于对JIT的经验,业界发展出动态编译器(dynamic compiler),动态编译器仅针对较常被执行的程序码进行编译,其余部分仍使用转译程序来执行。也就是说,动态编译器会研判是否要编译每个类。动态编译器拥有两项利器:一是转译器,另一则是JIT,它透过智慧机制针对每个类进行分析,然后决定使用这两种利器的哪一种来达到最佳化的效果。

APC

Alternative PHP Cache (APC) 是一个开放自由的PHP opcode 缓存。它的目标是提供一个自由、 开放,和健全的框架用于缓存和优化PHP的中间代码。

apc.stat=1/0

这个选项是否启用脚本更新检查。 改变这个指令值要非常小心。 默认值 On 表示APC在每次请求脚本时都检查脚本是否被更新, 如果被更新则自动重新编译和缓存编译后的内容。但这样做对性能有不利影响。 如果设为 Off 则表示不进行检查,从而使性能得到大幅提高。 但是为了使更新的内容生效,你必须重启Web服务器(译者注:如果采用cgi/fcgi类似的,需重启cgi/fcgi进程)。 生产服务器上脚本文件很少更改, 可以通过禁用本选项获得显著的性能提升。

这个指令对于include/require的文件同样有效。但是需要注意的是, 如果你使用的是相对路径,APC就必须在每一次include/require时都进行检查以定位文件。 而使用绝对路径则可以跳过检查,所以鼓励你使用绝对路径进行include/require操作。

2PHP运行机制浅析

流程

1、如上例中, 传递给php程序需要执行的文件, php程序完成基本的准备工作后启动PHP及Zend引擎, 加载注册的扩展模块。

2、初始化完成后读取脚本文件,Zend引擎对脚本文件进行词法分析,语法分析。然后编译成opcode执行。 如果安装了apc之类的opcode缓存,编译环节可能会被跳过而直接从缓存中读取opcode执行

Sapi

Sapi的定义是PHP具体应用的编程接口没错,但它绝对不是写php代码的规范,而是贯穿php代码生命周期的运行规范接口。PHP五种运行模式:包括cgi 、fast-cgi、cli、isapi、apache模块的DLL ,分别是对Sapi接口的实现。

Php-fpm

全称是php fastcgi process manager即php fastcgi进程管理器,相比fastcgi静态的唤起cgi,fpm能根据访问的压力动态的唤起cgi进程和销毁以到达动态的调整cgi数量,这样可以有效的使用内存。除此之外还有其它的一些优点,比如,fpm还可以平滑的重载php配置;由于fpm是使用Unix-Socket来和服务器通讯,所以也不用再配置cgi端口;fpm有更好的状态输出和slowlog日志,502的时候能给出更多的错误细节。

各指令如下:

/usr/local/php/sbin/php-fpm {start|stop|quit|restart|reload|logrotate}

Zend引擎

Zend整体用纯C实现,是PHP的内核部分,类似java的jvm。

它将PHP代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现。

Extensions

围绕着Zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的PHP中间层、富文本解析就是extension的典型应用)。

附五种php运行模式

http://www.phpernote.com/news/723.html

CGI

方式在遇到连接请求(用户 请求)先要创建cgi的子进程,激活一个CGI进程,然后处理请求,处理完后结束这个子进程。这就是fork-and-execute模式。所以用cgi方式的服务器有多少连接请求就会有多少cgi子进程,子进程反复加载是cgi性能低下的主要原因。

fast-cgi

是cgi的升级版本,FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全称PHP FastCGI进程管理器进行管理。

1、Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)

2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。

3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。

4、 FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。

在上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的 好处是,持续数据库连接(Persistent database connection)可以工作。

cli

是php的命令行运行模式,大家经常会使用它,但是可能并没有注意到(例如:我们在linux下经常使用 “php -m”查找PHP安装了那些扩展就是PHP命令行运行模式;有兴趣的同学可以输入php -h去深入研究该运行模式)

ISAPI

即Internet Server Application Program Interface,是微软提供的一套面向Internet服务的API接口,一个ISAPI的DLL,可以在被用户请求激活后长驻内存,等待用户的另一个请求,还可以在一个DLL里设置多个用户请求处理函数,此外,ISAPI的DLL应用程序和WWW服务器处于同一个进程中,效率要显著高于CGI。(由于微软的排他性,只能运行于windows环境)

apache模块的DLL运行模式

此运行模式是我们以前在windows环境下使用apache服务器经常使用的,而在模块化(DLL)中,PHP是与Web服务器一起启动并运行的。

时间: 2024-08-09 05:34:27

php的一些基本概念梳理的相关文章

Javascript基本概念梳理

javascript里的数据类型: 原始类型:数字,字符串,布尔值.(原始值:null,undefined) 对象类型:键值对,数组,function,全局对象(MATH,JSON) 包装对象的概念: 字符串"aaa".len 字符串并不是对象,但是却可以调用它的属性,说明这只是一个临时对象,内部用new String()来创建的临时的. 原始类型是永远不可变的,所以可以比较他们的值,但是对象类型是可变的,不能比较他们的值. Javascript原型和继承: Javascript里每个

[DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event

[DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event 事件 事件(Event)是用来通知代码,一些有趣的事情发生了. 每一个Event都会被一个Event对象所表示,这个对象可能还会有一些自定义的字段或者方法,来获取发生什么事情的更多信息. Event对象实现了Event接口(https://developer.mozilla.org/en-US/docs/Web/API/Event). 事件可以是任何事情,从最基本的用户交互,到renderin

分布式、微服务、集群概念梳理

分布式.微服务.集群概念梳理 分布式 从本质上讲分布式表明的是一种解决方案,即由传统的单体应用,扩展成多体结构. 它的实施基础就是将可以独立出来的功能模块放在不同的服务器上,然后通过REST,RPC,消息中间件等方式来实现不同服务器之间的通信,这些不同服务器上的不同模块实现通信后,最后组成多体应用. 说的分布式,就不得不提到SOA架构,SOA是软件开发重要的思想,即面向服务的体系结构,是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.接口是采用中

汇编语言程序设计 第2章概念梳理

汇编语言程序设计 第2章概念梳理 8086 14个寄存器: AX,BX,CX,DX (通用寄存器) SI,DI,BP,SP (基址和变址寄存器) CS,SS,DS,ES (段寄存器) IP,FLAGS (指令指针和标志寄存器) 通用寄存器: AX,BX,CX,DX通常用于存放一般性数据 称为通用寄存器 一般存储的数据范围为0 ~ 2^16-1 且为了与早期CPU操作兼容,这4个寄存器均可拆分成2个8位寄存器单独使用 {             AX分为AH和AL            BX分为B

汇编语言程序设计 第3章概念梳理

汇编语言程序设计 第3章概念梳理 基础概念部分:{ 字数据在内存当中的存储:高-高 低-低     字数据的低位字节存放在低地址内存单元     字数据的高位字节存放在高地址内存单元 取低地址内存单元地址作为字数据地址,例如数据124EH:    12H存储在偏移量为"2"的字节单元,4EH存储在偏移量为"1"的字节单元    则从地址为"1"的地址单元取出的一个字数据为124EH   12为高位,故存储在高位"2"单元,4E

Kubernetes几个神奇的概念梳理

Kubernetes 功能丰富而强大,学习研究期间有些概念,个人感觉还是有点绕,为了方便理解简单进行梳理,相关核心概念整理如下: K8s控制器Deployment与DaemonSet区别 不同点 Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本.DaemonSet 的不同之处在于,每个 Node 上最多只能运行一个副本. kubernetes 中三种IP 包括 1. NodeIP node节点的IP地址 2. Pod IP pod的IP地

Web Service概念梳理

计算机技术难理解的很多,Web Service 对我来说就是一个很难理解的概念:为了弄清它到底是什么,我花费了两周的时间,总算有了一些收获,参考了不少网上的资料,但有些概念说法不一.我以w3c和 一些早期介绍Web Service的书为准.如有错误,欢迎指正! -------------------------------------------------------------- 提前预警!概念太多,你需要仔细阅读,或要阅读两遍.   SOA                        

多通道(Multichannel)单通道(singlechannel)图像概念梳理

在做机器视觉时,常常要将一个多通道图像分离成几个单通道图像或者将几个单通道图像合成一个多通道图像,以方便图像处理,但是.写这篇博客,是为加深对这两个概念的理解,下面会给出部分OpenCV对单通道与多通道图像间相互转化的程序代码,并对运行结果进行观察分析. OpenCV中常用IplImage或CvMat存储图像矩阵,而对这两个对象的初始化函数cvCreateImage(CvSize size, int depth, int channels )和cvCreateMat( int rows, int

[转]Android中dp,px,sp概念梳理以及如何做到屏幕适配

http://blog.csdn.net/jiangwei0910410003/article/details/40509571 今天又开始我的App开发,因为之前一直做的是SDK,所以涉及到界面UI很少,刚开始做Android应用的时候,没有对dp,px,sp等概念有一个深入的了解,只知道他们之间的转化,还有写个转换工具类等.做Android已经有一年多了,现在再次开始App开发,决定没遇到一个概念,必须得弄透彻.好吧,下面进入主题吧: 首先来看一下他们的基本概念: px   :是屏幕的像素点

Android中dp,px,sp概念梳理

今天又开始我的App开发,因为之前一直做的是SDK,所以涉及到界面UI很少,刚开始做Android应用的时候,没有对dp,px,sp等概念有一个深入的了解,只知道他们之间的转化,还有写个转换工具类等.做Android已经有一年多了,现在再次开始App开发,决定没遇到一个概念,必须得弄透彻.好吧,下面进入主题吧: 首先来看一下他们的基本概念: px   :是屏幕的像素点dp   :一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1pxdip  :等同于dpsp   :同dp相