浅析PHP运行机制

对于php来说,了解它的运行机制,有助于我们写出高效健壮的代码,会更清楚程序的代码到底该怎么去写,如果是做php扩展,那了解它的运行机制就更是必须的了。

 

一、 运行环境:LAMP的A、M、P是如何互通工作的?

L:Linux/Windows(OS)

A:Apache(server)

M:Mysql(DB)

P:PHP

1. 分别安装Apache、Mysql、PHP

2. PHP和DB的互通:修改php配置文件php.ini,“;extension=php_mysql.dll”把冒号去掉,这样php就可以支持mysql数据库了

3. Server和PHP的互通:修改apache的配置文件httpd.conf,在LoadModule配置块添加LoadModule php5_module d:\php5\php5Apache2_2.dll”;添加希望Apache服务器能够识别的PHP扩展名“AddType application/x-httpd-php .php”;默认显示页“DirectoryIndex index.html index.php”;修改apache端口号“Listen 82”

前两相配置就是告诉apache server,以后收到的Url用户请求,凡是以php作为后缀,就需要调用php5_module模块进行处理。

 

二、 PHP运行过程简介

PHP总共有三个模块:内核、Zend引擎、扩展层。

1. PHP内核用来处理请求、文件流、错误处理等相关操作;

2. zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;

3. 扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作,比如:我们需要mysql扩展来连接mysql数据库;

当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;最后,ZE将程序运行结果返回给PHP内核,它再将结果传送给SAPI层(服务器应用程序编程接口),最终输出到浏览器上。

简单来说,整个运行过程即:

1. 启动apache,PHP解释程序也随之启动;

      其中php的启动主要包括两部分

1) 初始化一些环境变量,这将在整个SAPI生命周期中发生作用。PHP调用各个扩展(php.ini文件中打开的扩展)的MINIT方法(MINIT的意思是模块初始化,各个模块都定义了一组函数、类库等用以处理其他请求),从而使这些扩展切换到可用状态

2) 生成只针对当前请求的一些变量设置。当一个页面请求发生时,SAPI层将控制权交给PHP层,于是php设置了用于回复本次请求所需的环境变量,同时,它还建立一个变量表,用来存放执行过程中产生的变量名和值;PHP调用各个模块的RINIT方法,即“请求初始化”,一个经典的例子是session模块的RINIT,如果在php.ini中启用了session模块,那在调用该模块的RINIT时就会初始化$_SESSION变量,并将相关内容读入。2. PHP关闭

关闭也分两步

1) 一旦页面执行完毕(无论是执行到了文件末尾还是用exit或die函数终止),php就会启动清理程序,它会按顺序调用各个模块的RSHUTDOWN方法,RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。

2) PHP调用每个扩展的MSHUTDOWN方法,这是各个模块最后一次释放内存的机会。这样,整个PHP生命周期就结束了。

 

三、 PHP运行机制

首先,讲一下apache,它是目前使用最为广泛的一种web server,优点是跨平台、高效和稳定,缺点是越来越重

Apache组件逻辑图:

由图中就可以看出,Apache是基于模块化设计的,总体上看起来代码的可读性高于php的代码,它的核心代码并不多,大多数的功能都被分散到各个模块中,各个模块在系统启动的时候按需载入。

1. MPM:Multi -Processing Modules,多重处理模块,是Apache的核心组件之一,Apache通过MPM来使用操作系统的资源,对进程和线程池进行管理。最常用的是prefork和worker。

2. APR:Apache portable Runtime Library,即Apache可移植运行库,它是一个对操作系统调用的抽象库,用来实现Apache内部组件对操作系统的使用,提高系统的可移植性。

3. Php module:Apache对于php的解析,就是通过众多Module中的php Module来完成的。

启动阶段

在这个阶段,Apache为了获得系统资源最大的使用权限,将以特权用户root(X系统)或超级管理员administrator(Windows系统)完成启动。

运行阶段

在运行阶段,Apache主要工作是处理用户的服务请求。

这个阶段,Apache放弃特权用户级别,使用普通权限,这主要是基于安全性的考虑,防止由于代码的缺陷引起的安全漏洞。

Apache将请求处理循环分为11个阶段,如图:

这里,讲一个比较重要的概念,apache的Hook机制,是指Apache 允许模块(包括内部模块和外部模块,例如mod_php5.so,mod_perl.so等)将自定义的函数注入到请求处理循环中。换句话说,模块可以在Apache的任何一个处理阶段中挂接(Hook)上自己的处理函数,从而参与Apache的请求处理过程。

关于Hook机制在Windows系统开发也经常遇到,在Windows开发既有系统级的钩子,又有应用级的钩子。常见的翻译软件(例如金山词霸等等)的屏幕取词功能,大多数是通过安装系统级钩子函数完成的,将自定义函数替换gdi32.dll中的屏幕输出的绘制函数。

你可能感兴趣的:(php)