【问题标题】:PHP compile time vs run time. Understanding the difference [duplicate]PHP 编译时间与运行时间。了解差异[重复]
【发布时间】:2014-07-20 11:50:27
【问题描述】:

我经常听到这两个词并不断思考

PHP 中编译时间和运行时间有什么区别?

我尝试阅读一些文章,但没有帮助。

有人知道一个简单的解释吗?它们彼此有何不同?

【问题讨论】:

  • 编译时间是脚本文件加载到内存并标记化的时间(如果您使用操作码缓存,这是第一次请求脚本时的一次性练习);运行时间是该代码实际执行的时间
  • PHP 是一种解释型语言,因此它的工作方式与 C++ 大不相同
  • 正如他们其他两个回复已经指出的那样,PHP 是一种交互语言。这意味着您可以将原始.php 文件加载到您的PHP 引擎(网络服务器/其他),它们将执行。其他语言(如 Java、C# 和 C++)也被编译。这意味着原始文件实际上并未加载到您的应用程序中,而是编译器读取这些文件并构建可执行文件。

标签: php


【解决方案1】:

PHP 在运行文件时会进行两次传递(默认情况下)。

Pass #1 解析文件并构建所谓的操作(或机器)代码。这是您的计算机将实际运行的原始二进制格式,它不是人类可读的。在其他语言(如 C++ 等)中,这称为编译。您可以使用 Opcache 等各种系统缓存此步骤,从而节省您每次编译的开销。

语法错误来自这部分执行。

Pass #2 执行 Pass #1 中的操作代码。这就是通常所说的“运行时”,因为您的计算机实际上正在执行指令。

运行时错误(如耗尽内存、异常终止等)来自此级别。然而,这些比语法错误少得多。

【讨论】:

  • 那么某些代码如何在编译时运行而其他在运行时运行呢?根据您的描述,似乎所有代码在运行时都会抛出错误
  • 取决于错误。语法错误将在编译中被捕获。运行时错误(例如您的进程耗尽分配的内存)将从运行时抛出。
【解决方案2】:

PHP 文件分两个阶段运行。

首先,解析 PHP 文件。此时,来自网络浏览器(或任何其他来源)的数据完全无关紧要。所做的一切就是将 PHP 文件分解为其组成部分并构建代码结构。

然后使用您提供的数据执行代码。

这种分离使代码速度大大加快。当您有像 APC 或 OPcache 这样的操作码缓存时尤其如此,因为在后续情况下可以跳过第一步,因为代码的结构完全相同。

您遇到差异的时间主要是错误。比如这段代码会在编译阶段报错:

function class() {
    // some code
}

这是不可能的,因为class 是保留字。 PHP 可以在编译代码时发现这一点:它总是会失败。它可能永远工作。

但是,此代码可能会在运行时导致错误:

echo $_GET['nonExistingKey'];

由于密钥nonExistingKey不存在,无法取回,所以报错。但是,PHP 在最初编译代码时无法决定这一点,只有在使用您提供的数据运行时才能决定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 2010-10-25
    • 2013-09-19
    • 2018-07-24
    • 2017-06-14
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多