PHP 是一种服务器端脚本语言,最初由 Rasmus Lerdorf 于 1994 年开发,用于管理他的个人网站。 1995 年,PHP 向公众发布,使 Web 开发人员能够更轻松地创建动态内容。 PHP 代码在服务器端运行,非常适合创建与数据库交互、处理用户输入和提供动态网页的 Web 应用程序。
让我们从一个简单的例子开始:
echo "Hello world";
如果您通过计算机的终端运行此代码,那么您将在终端中得到输出“Hello world”。我们知道我们的计算机只能理解0或1这样的机器码。
为了理解这一点,让我们看看计算机如何理解代码。计算机只能理解机器码,它是二进制格式(0 和 1)。对于要执行的高级代码(例如 PHP),需要将其转换为机器代码。这就是编译器和解释器发挥作用的地方。
编译器和解释器都是翻译软件或程序,将用编程语言编写的源代码转换为机器代码。也就是说,我们编写的人类可以理解的代码被这些编译器或解释器转换为计算机可以理解的机器代码(0和1),使其能够执行指令并向我们提供输出。让我们深入了解这些翻译器的基本概述,以便更好地理解它们。
解释器是一种翻译器,它逐行读取用高级语言编写的整个源代码,并立即将每一行转换为机器代码。如果它在读取一行代码时遇到错误,它会立即停止并向程序员报告错误,从而更容易调试。与编译器相比,这种逐行执行也使其过程更慢。
编译器是一种翻译器,它将用高级语言编写的整个源代码一次性转换为机器代码。如果代码中存在错误,编译器仍然会编译整个代码,但错误会在运行时被捕获,从而使程序员更难识别和修复错误。然而,由于编译器将整个源代码一次性转换为机器代码,因此在执行过程中它通常比解释器执行得更快。
所以答案是,PHP 主要是一种解释性语言。当 PHP 脚本运行时,PHP 解释器在运行时解析并执行代码,而不是像 C 或 C 等编译语言那样预先将其编译为机器代码。但是,一些优化(例如使用 OPcache 等工具进行字节码缓存)可以通过存储已编译的字节码来避免在每个请求上重新解释代码来提高性能。
还有像 HHVM(HipHop 虚拟机)这样的项目,它是由 Facebook 开发的,用于使用即时 (JIT) 编译过程执行 PHP 代码。这使得它能够将 PHP 代码编译为中间字节码,然后将其即时编译为机器代码,从而使 PHP 执行速度更快。在 PHP 8 中,JIT 编译直接集成到 PHP 中,允许编译部分代码,进一步模糊解释行为和编译行为之间的界限。
JIT,即即时编译,是一种通过“及时”而不是提前编译代码的一部分来执行代码的方法。与逐行读取和执行代码的传统解释执行不同,JIT 编译会在运行时需要之前将部分代码转换为机器代码。这会导致执行速度更快,因为机器代码直接在 CPU 上运行,避免了重复解释的需要。
JIT 编译位于完全解释执行和完全编译执行之间。它的一般工作原理如下:
初始解释:代码最初以轻量级方式解释或运行,以分析哪些部分最常使用或计算密集。
即时编译:JIT 编译器识别“热点”——经常运行或需要优化的代码部分。然后它在运行时将这些部分编译成机器代码。
执行:存储编译后的机器代码,因此以后的执行可以使用优化版本而无需重新编译,从而加快性能。
在 PHP 中,PHP 8 中引入了 JIT,通过在执行时将常用函数或循环编译为机器代码,可以使它们运行得更快。其他语言,例如 JavaScript(例如 Chrome 中的 V8 引擎)和 Java,也使用 JIT 编译来获得类似的性能优势。
在第一个块中,我们有编写的代码。该代码首先进入 JIT(即时编译器)。然后 JIT 编译并执行代码。在执行过程中,JIT 逐行读取代码,并在读取后立即将每一行转换为机器代码。如果在读取过程中任何一行出现错误,它会立即停止并抛出该错误。
因此,这让我们对计算机如何理解和运行高级 PHP 代码(我们编写的代码)有一些了解。
PHP 脚本可以在两种主要环境中运行:命令行界面 (CLI) 和 Web 服务器环境。
命令行界面(CLI):PHP 代码可以直接从计算机上的命令行执行。这使得开发人员无需浏览器即可运行脚本,通常用于自动化、cron 作业或测试脚本。
Web 服务器环境:PHP 通常在 Web 服务器环境中运行,其中执行代码以响应来自客户端/浏览器的请求。当请求 PHP 脚本时,Web 服务器通过接口层(如 CGI、FastCGI 或 FPM)与 PHP 引擎通信,后者处理脚本并将输出返回给客户端。
每种环境服务于不同的用例,使 PHP 成为 Web 和命令行应用程序的灵活语言。
我们的计算机包含出于不同目的而运行的各种应用程序或程序。然而,当我们去运行这些应用程序或程序时,它们无法自行执行。相反,它们通过计算机的操作系统运行。当我们用PHP编写代码时,它也变成了我们可以通过计算机终端运行的程序。因此,当我们通过终端运行代码时,它也会通过操作系统执行。
那么,问题是:这个应用程序或程序,或者我们编写的代码,如何与我们的计算机操作系统进行通信?
这里,用来与操作系统通信的手段称为OS API(Operating System’s API)。通过这个操作系统API,应用程序或程序可以与计算机的操作系统进行通信,如上图所示。这让我们对 PHP 代码如何通过我们计算机上的终端运行有一些了解。
首先,我们从客户端/浏览器向 Web 服务器发送请求。但是,Web 服务器无法直接与 PHP 引擎通信。对于 Web 服务器和 PHP 引擎之间的通信,它们之间有一个中间层,称为 SAPI 或服务器 API。使用不同的协议作为 SAPI,允许 Web 服务器与 PHP 引擎进行通信。这些协议包括CGI、FastCGI、mod_php、FPM等。这些协议中的任何一种都可以用于Web服务器和PHP引擎之间的通信。
运行 PHP 脚本的两个最流行的 Web 服务器是 Apache 和 Nginx:
这让我们更好地理解 PHP 代码如何在 Web 服务器上运行。基于以上几点。
我希望对 PHP 代码在幕后如何实际工作有一个基本的了解。如果有帮助,别忘了分享给其他人。
以上是PHP 的工作原理 - 幕后花絮的详细内容。更多信息请关注PHP中文网其他相关文章!