PHP运行原理和机制
本文目录导航:
PHP运行原理和机制
PHP 是一种用于 Web 开发的脚本语言,其工作原理和机制主要涉及核心组件 Zend 引擎、扩展、SAPI 以及上层应用。
了解这些底层实现有助于更高效地运用 PHP,优化程序性能,实现强大功能。
Zend 引擎作为 PHP 的核心,使用 C 语言实现,负责编译 PHP 代码为可执行的 opcode,并提供数据结构和内存管理。
Extensions 则通过组件化方式提供基础服务,如内置函数和标准库,用户可自定义扩展以扩展功能或优化性能。
SAPI,即服务器应用程序编程接口,通过一系列钩子函数使得 PHP 可以与外部数据交互,实现与不同应用的解耦。
它包括多种实现方式,如 CGI、fast-cgi、CLI 等。
CGI 是通用网关接口,实现 Web 服务器与执行程序间的连接,处理 HTML 指令。
FastCGI 是 CGI 的升级版,实现常驻型执行,提高性能。
CLI 是命令行界面运行模式。
ISAPI 是微软提供给 Internet 服务的 API 接口,适用于 Windows 环境。
PHP 的执行流程始于代码的词法、语法解析,最终转化为 opcode,由 Zend 虚拟机顺序执行。
opcode 是执行的基本单位,由参数、返回值和处理函数组成。
在执行过程中,关键数据结构如 HashTable 和 Zval 被用于存储和操作变量。
HashTable 是 Zend 的核心数据结构,广泛应用于 PHP 功能实现,如数组、函数符号表和全局变量。
Zval 用于标识和实现 PHP 变量,由实际数据、引用计数和特殊标志组成。
引用计数机制实现变量共享,避免频繁复制,减少资源消耗。
写时复制策略仅在有写操作时复制变量,以提高效率。
综上所述,通过深入理解 PHP 的运行原理和机制,开发者可以更灵活地运用语言特性,优化程序性能,实现更复杂的 Web 应用。

【PHP】Laravel 运行原理分析与源码分析,底层看这篇足矣
一、运行原理概述laravel 的入口文件 1、引入自动加载 2、创建应用实例,并同时完成了3、开始 Http 请求的处理make 方法从容器中解析指定的值为实际的类,比如$app->make(Illuminate\Contracts\Http\Kernel::class) 解析出 App\Http\ handle 方法对 http 请求进行处理实际上是handle 中的 sendRequestThroughRouter 处理的 http 请求首先,将request 绑定到共享实例然后执行bootstarp 方法,运行给定的引导类数组 $bootstrappers,这里很关键,包括了加载配置文件、环境变量、服务提供者(config/ 中的 providers)、门面、异常处理、引导提供者之后,进入管道模式,经过中间件的处理过滤后,再进行用户请求的分发在请求分发时,首先,查找与给定请求匹配的路由,然后执行runRoute 方法,实际处理请求的是 runRouteWithinStack 方法然后,经过runRouteWithinStack 中的 run 方法,将请求分配到实际的控制器中,并得到响应结果4、将处理结果返回二、详细源码分析1、注册自动加载器,实现文件的自动加载2、创建应用容器实例 Application(该实例继承自容器类 Container),并绑定核心(web、命令行、异常),以便在需要时解析它们 文件如下:3、在创建应用实例()的构造函数中,将基本绑定注册到容器中,并注册了所有的基本服务提供者,以及在容器中注册核心类别名3.1、将基本绑定注册到容器中3.2、注册所有基本服务提供者 (事件、日志、路由)3.3、在容器中注册核心类别名4、上面完成了类的自动加载、服务提供者注册、核心类的绑定、以及基本注册的绑定5、开始解析 http 请求5.1 make 方法是从容器解析给定值5.2 这里对 http 请求进行处理进入 $kernel 所代表的类App\Http\ 中,我们可以看到其实里面只是定义了一些中间件相关的内容,并没有 handle 方法我们再到它的父类use Illuminate\Foundation\Http\Kernel as HttpKernel; 中找 handle 方法,可以看到 handle 方法是这样的6、处理 http 请求(将 request 绑定到共享实例,并使用管道模式处理用户请求)进入 sendRequestThroughRouter 方法7、在 bootstrap 方法中,运行给定的引导类数组 $bootstrappers,加载配置文件、环境变量、服务提供者、门面、异常处理、引导提供者,非常重要的一步位置在vendor/laravel/framework/src/Illuminate/Foundation/Http/8、加载 config/ 中的 providers 数组里所定义的服务可以看到,关于常用的Redis、session、queue、auth、database、Route 等服务都是在这里进行加载的9、使用管道模式处理用户请求,先经过中间件进行处理app/Http/10、经过中间件处理后,再进行请求分发(包括查找匹配路由)/**到现在,已经找到与请求相匹配的路由了,之后将运行了,也就是 10.4 中的 runRoute 方法11、运行路由并返回响应 [重点]可以看到,10.7 中有一个方法是 prepareResponse,该方法是从给定值创建响应实例,而 runRouteWithinStack 方法则是在栈中运行路由,也就是说,http 的请求和响应都将在这里完成。
php底层原理 php是如何运行的
1、PHP动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes),然后ZEND虚拟机顺次执行这些指令完成操作。
PHP本身是用C实现的,因此最终调用的也是C的函数,实际上,我们可以把PHP看做一个C开发的软件。
2、PHP的4层运行体系: (1)Zend引擎:Zend整体用纯C实现,是PHP的内核部分,他将PHP代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如:hashtable、OO)、内存分配机制及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现。
(2)Extensions:围绕着Zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension的典型应用)。
(3)Sapi:Sapi全称ServerApplicationProgrammingInterface,也就是服务端应用编程接口,Sapi通过一系列钩子函数,使得PHP可以和外围交互数据,这是PHP非常优雅和成功的设计,通过sapi成功的将PHP本身和上层应用解耦隔离,PHP可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。
(4)上层应用:这就是我们平时编写的PHP程序,通过不同的spai方式得到各种各样的应用模式,如何通过webserver实现web应用、在命令行下已脚本方式运行等等。