php - PHP 是如何工作的以及它的架构是什么?

标签 php

伙计们,最近我决定回到 PHP 并做一些比简单登录页面更复杂的事情。三年来我一直使用 Java/JavaEE 进行编程,并且对 Java 应用程序的架构有很好的理解。基本上,一个虚拟机(一个简单的操作系统进程)运行称为字节码的编译代码。一个简单的 Java Web 服务器基本上是一个 Java 应用程序,它监听提供的 TCP 端口上的 Http 请求并相应地响应,当然它比这更复杂,但这是它的初始工作。

现在,PHP 怎么样?它是如何工作的 ?简而言之,就是它的架构。

我在 google 上搜索了这个问题,但 90% 的文章解释了如何使用 PHP 实现和构建 Web 应用程序,这不是我想要的。

最佳答案

Java Web 服务器和 PHP 之间最大的区别是 PHP 没有自己的内置 Web 服务器。 (嗯,较新的版本可以,但它应该仅用于测试,它不是一个生产就绪的 Web 服务器。)PHP 本身基本上是一个可执行文件,它读取 PHP 代码的源代码文件并解释/执行其中编写的命令文件。就是这样。简而言之,这就是 PHP 的架构。

该可执行文件支持用户态 PHP 代码可以调用的默认 API,并且可以添加扩展以提供更多 API。这些扩展通常用 C 语言编写,并在安装时与 PHP 可执行文件一起编译。有些扩展只能通过使用附加标志重新编译 PHP 来添加,其他扩展可以针对 PHP 安装进行编译,并在事后通过配置文件激活。 PHP 提供了 PEAR 和 PECL 副项目,以标准化和简化此类事后安装。用户态 PHP 代码通常还包含仅用 PHP 代码编写的其他第三方库。 C 扩展的优点是它们的执行速度和低级系统访问,用户态代码库的优点是它们的简单包含。如果您正在管理自己的 PHP 安装,添加新的 PHP 扩展通常很简单;然而,在非常流行的共享主机模型中,主机想要安装的内容和开发人员需要的内容之间经常存在紧张关系。

在实践中,用 PHP 编写的 Web 服务在第三方 Web 服务器(通常是 Apache)上运行,它处理任何传入请求并使用给定请求的 PHP 源代码文件作为参数调用 PHP 解释器,然后提供该文件的任何输出处理返回给 HTTP 客户端。这也意味着不存在像 Java 通常那样始终以持久状态运行的持久 PHP 进程,但每个请求都是通过启动然后拆除新的 PHP 实例来处理的。

虽然 Java 只是将持久性数据保存在内存中,但 PHP 中请求之间的数据持久性是通过多种方法处理的,例如 memcache、 session 、数据库、文件等;视情况具体需要而定。 PHP 确实有操作码缓存插件,其工作方式类似于 Java 字节码,因此 PHP 不必每次执行同一文件时都重复相同的解析和编译过程。

请记住,编写一个像 Java 一样持续运行的持久性 PHP 程序是完全可行的,这根本不是 PHP 的默认操作方式。就我个人而言,我非常喜欢在 Gearman 或 ZMQ 上编写持续运行的特定任务的工作程序,并在 Web 服务器上运行一些临时脚本作为“前端”,根据需要将工作委托(delegate)给这些工作程序。

如果这听起来像是一个典型的 PHP 应用程序更像是几个不同组件粘合在一起的累积,那么您是对的。除了 RDBMS 服务器等外部产品之外,Java 是相当独立的。另一方面,PHP 通常倾向于依赖一堆第三方产品;这可以发挥其优势,因为您可以使用同类最佳的产品来执行特定任务,但也需要更多的开销来处理不同的系统。

关于php - PHP 是如何工作的以及它的架构是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24797539/

相关文章:

javascript - 如何混合 PHP 和 Javascript 变量(如果有的话)?

php - 表单提交后填写文件输入/表单提交错误

javascript - 如何在<pre>标签的每一行末尾添加<br/>?

javascript - 如何在 hh :mm:ss format in javascript 中一次增加或减少百分比

PHP PDO sqlsrv 未定义的类常量 SQLSRV_ENCODING_UTF8

PHP 错误处理

php - 使用 php 中的函数创建数据库连接?

php - 在 For 循环中运行查询

php - 从数据库填充下拉列表

php - 当父行链接到子行时