`

PHP的运行原理 : 内幕:PHP是如何显示“你好世界”的?

阅读更多
转载于 :  http://www.yeeyan.com/articles/view/38585/19474

  你有没有想过PHP是怎么在浏览器里输出“你好世界”的?我也是看了PHP内核和扩展后才知道的。也许有些朋友也想知道其中原理,那就让我们开始吧。

  在上一篇网志里我简单介绍了“在我浏览这个页面之前都发生了些什么?”这个问题。如果你错过了就点这里看看吧。现在我要讨论的是“PHP是怎样在浏览器里输出内容”这个问题。

简介

  先看看下面这个过程:

   1. 我们从未手动开启过PHP的相关进程,它是随着Apache的启动而运行的;
   2. PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口);
   3. PHP总共有三个模块:内核、Zend引擎、以及扩展层;
   4. PHP内核用来处理请求、文件流、错误处理等相关操作;
   5. Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;
   6. 扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们需要mysql扩展来连接MySQL数据库;
   7. 当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;
   8. 最后,ZE将程序运行结果返回给PHP内核,它再将结果传送给SAPI层,最终输出到浏览器上。

深入探讨

  等等,没有这么简单。以上过程只是个简略版,让我们再深入挖掘一下,看看幕后还发生了些什么。

   1. Apache启动后,PHP解释程序也随之启动;
   2. PHP的启动过程有两步;
   3. 第一步是初始化一些环境变量,这将在整个SAPI生命周期中发生作用;
   4. 第二步是生成只针对当前请求的一些变量设置。

PHP启动第一步

  不清楚什么第一第二步是什么?别担心,我们接下来详细讨论一下。让我们先看看第一步,也是最主要的一步。要记住的是,第一步的操作在任何请求到达之前就发生了。

   1. 启动Apache后,PHP解释程序也随之启动;
   2. PHP调用各个扩展的MINIT方法,从而使这些扩展切换到可用状态。看看php.ini文件里打开了哪些扩展吧;
   3. MINIT的意思是“模块初始化”。各个模块都定义了一组函数、类库等用以处理其他请求。

  一个典型的MINIT方法如下:

PHP_MINIT_FUNCTION(extension_name){

/* Initialize functions, classes etc */

}

PHP启动第二步

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

  一个典型的RINIT方法如下:

PHP_RINIT_FUNCTION(extension_name) {

/* Initialize session variables, pre-populate variables, redefine global variables etc */

}

PHP关闭第一步

  如同PHP启动一样,PHP的关闭也分两步:

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

  一个典型的RSHUTDOWN方法如下:

PHP_RSHUTDOWN_FUNCTION(extension_name) {

/* Do memory management, unset all variables used in the last PHP call etc */

}

PHP关闭第二步

  最后,所有的请求都已处理完毕,SAPI也准备关闭了,PHP开始执行第二步:

   1. PHP调用每个扩展的MSHUTDOWN方法,这是各个模块最后一次释放内存的机会。

  一个典型的RSHUTDOWN方法如下:

PHP_MSHUTDOWN_FUNCTION(extension_name) {

/* Free handlers and persistent memory etc */

}

  这样,整个PHP生命周期就结束了。要注意的是,只有在服务器没有请求的情况下才会执行“启动第一步”和“关闭第二步”。
分享到:
评论

相关推荐

    PHP运行机制.pdf

    本文档旨在深入探索PHP的运行机制,通过图解的方式,帮助读者理解PHP在服务器环境中的工作原理及其内部处理流程。这对于那些希望深入了解PHP底层实现以及如何优化其应用程序性能的开发人员来说至关重要。 #### 二、...

    PHP100视频教程全集112集BT种子【PHP经典】

    PHP100视频教程41:PHP站内搜索、多关键字、加亮显示 PHP100视频教程42:PHP通过mail()或Socket发邮件 PHP100视频教程43:PHP中MVC学习之ThinkPHP(上) PHP100视频教程44:PHP中MVC学习之ThinkPHP(下) PHP100...

    php企业网站模板

    4.运行环境? 答:linux/windows+apache/nginx+php+mysql php建议用php5.4 php5.5 php5.6 高一点的好 5.模板文件夹在哪? 答:themes/Home/ 6.修改了后台或代码相关信息 前台没发生变化? 答:点击后台右上角第一...

    PHP(50选择题).doc

    exit() 和 die() 函数都是用于终止脚本执行的,但 die() 函数可以显示错误信息。 _PHP 日期时间_ 14. 下面程序运行结果?答案:B、得到今天的日期(年-月-日)与下周的日期(年-月-日)。该代码使用 time() 函数取得...

    PHP 导出Excel (注:导出带图片的EXCEL也支持)

    在项目根目录下运行以下命令: ``` composer require phpoffice/phpspreadsheet ``` 2. **创建Excel工作簿**:使用phpspreadsheet创建一个新的Excel工作簿对象,这是所有操作的基础。 ```php use PhpOffice\...

    PHP的FPDF的中文包chinese.php

    $pdf->Write(5, '你好,世界!'); // 输出中文 $pdf->Output(); // 生成并输出PDF ``` `ex.pdf`是运行`ex.php`后生成的PDF文件,展示了`chinese.php`成功在PDF中显示中文的效果。 在实际应用中,开发者需要确保...

    简单的PHP测试网页

    php echo "Hello, World!"; ?>`,当访问这个页面时,浏览器将显示"Hello, World!"。这展示了PHP如何处理输出和基本的字符串操作。 2. **phpinfo页面**:`phpinfo()`函数是PHP内置的一个实用工具,用于显示当前PHP...

    一个简单的php模版引擎

    首先,模板引擎的基本原理是将HTML页面中嵌入PHP代码,这些代码通常用于动态生成内容。例如,`<?php echo $name; ?>`这样的语句会根据PHP变量$name的值动态输出文本。这个简单的模板引擎实现了这一基本功能,允许...

    PHP 分页原理 (有注释)

    ### PHP 分页原理详解 #### 一、分页的基本概念 在Web开发中,当数据量较大时,一次性展示所有数据不仅会导致页面加载速度变慢,还会影响用户体验。因此,通常采用分页技术来实现数据的分批显示,即每次只显示一...

    php_pdo_oci.dll支持PHP的各个版本

    总之,php_pdo_oci.dll是PHP与Oracle数据库交互的关键组件,理解其工作原理和故障排查方法对于提升开发效率和确保应用程序稳定运行至关重要。在实际操作中,务必确保与PHP版本匹配,并正确配置环境,这样才能充分...

    PHP系统开发框架QuickPHP.zip

    二:您想要一款全中文详细注释以方便您学习框架原理的框架吗?三:您想要一款全中文各接口详细注释以方便您更快速开发的框架吗?四:您想要一款几乎零配置就能达到企业产品级应用的框架吗?五:您想要一款可以随便扔...

    php小偷程序原理和实例

    **PHP小偷程序原理与实例解析** PHP小偷程序,也称为PHP爬虫或PHP抓取程序,是一种利用PHP语言实现的网页数据抓取技术。它通过模拟浏览器发送HTTP请求,获取并处理互联网上的HTML或其他格式的数据,常用于数据分析...

    2022年最新PHP技术笔试题.doc

    3. PHP 错误处理:下面脚本运行后,屏幕显示什么样的信息?答案:D. def\nNotice: Undefined index: def in /xx/yy/zz.php on line 44. 知识点:PHP 错误处理, PHP 的 error_reporting 函数可以用来设置错误报告...

    支付宝免签约php接口,asp接口代码

    一、免签约接口运行原理:(用户充值,用户升级,自动发卡等网站) 二、回调参数说明:(GET方式) 参数名 参数 说明 交易密钥 PayKey 回调验证,密钥为 XunTg 不能修改 支付宝交易号 PayYihao 支付宝转账流水号 ...

    PHP009电影资讯信息网站毕业课程源码设计+说明书+答辩ppt

    1运行环境: 客户端环境:兼容如下浏览器:IE6、IE7、IE8、Firefox3、Opera等 服务器端硬件要求: CPU:主频2.4Hz以上 内存:2G以上 硬盘:20G以上 服务器端软件环境: 操作系统:CentOS5 Web服务器:Apache...

    iis下运行php

    - **FastCGI 的概念**:FastCGI 是一种通用网关接口(CGI)的增强版本,允许长时间运行一个进程来处理多个请求,从而提高了性能。在 IIS 中,FastCGI 作为 IIS 扩展程序被广泛使用,用于运行 PHP 应用程序。 - **...

    linux下自动运行php或定时运行php

    php $file = '/htdocs/www/b100/egspace/Bin/test/'.date('H').'-'.date('i').'-'.date('s').'.txt'; file_put_contents($file, date('Y-m-d')); ?> ``` `-q`参数表示静默模式,防止输出任何非错误信息。 2. *...

    php-5.4.7.tar.gz

    php phpinfo(); ?>`,通过浏览器访问,如果显示PHP信息,说明部署成功。 三、安全与优化 1. **权限设置**:合理设置PHP-FPM运行用户和组,避免权限过大造成安全风险。 2. **配置优化**:调整php.ini中的配置参数,...

    PHP实现随机显示目录下的图片

    PHP实现随机显示目录下的图片 实现方法可以有很多种,用JavaScript写的话,程序流程应该是:建立一个图片数组->随机选择数组里其中一个值->生成样式并写入body标签。 可是用JS做的话,有以下缺点: 1.万一浏览器...

Global site tag (gtag.js) - Google Analytics