【问题标题】:How does PHP works and what is its architecture ?PHP 是如何工作的,它的架构是什么?
【发布时间】:2014-07-17 07:37:03
【问题描述】:

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

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

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

【问题讨论】:

  • 虚拟机和编译几乎都是......解释器。 Web 服务器架构取决于 Web 服务器,这里没有特定语言
  • 有点跑题了,但是如果你是从 PHP 开始的,我会推荐你​​ phptherightway 作为一个关于如何正确开始的非常有用的资源。
  • 好吧,因为 Java 更适合企业和企业应用程序。网站和在线商店更经常使用 PHP 编写,并且有很多 CMS 服务于这些目的
  • PHP 完全可以用于企业应用程序;大多数人将它用于简单的网站这一事实并不妨碍它被用于企业

标签: php


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

PHP 是这样工作的:

(互联网上最好的之一)

【讨论】:

  • 哪个compile用于将php代码转换为c语言@yousha
  • @saurabhkamble 他们为此使用了自己的 Zend 编译器
【解决方案3】:

一般来说,PHP 作为一个引擎将 PHP 文件(通常是 *.php,尽管偶尔使用替代扩展名)的内容解释为抽象语法树。然后 PHP 引擎处理翻译后的 AST,然后根据需要的输入和处理返回结果。

下图将描述更多信息

来源:freecodecamp.org

【讨论】:

    猜你喜欢
    • 2013-02-13
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2018-09-05
    • 2012-11-15
    • 1970-01-01
    相关资源
    最近更新 更多