PHP编译时间与运行时间。了解差异

时间:2014-05-30 16:31:58

标签: php

我经常听到这两个词并继续思考

  

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

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

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

2 个答案:

答案 0 :(得分:20)

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

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

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

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

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

答案 1 :(得分:13)

PHP文件分两个阶段运行。

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

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

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

您遇到差异的时间主要是错误。例如,此代码将在编译阶段导致错误:

function class() {
    // some code
}

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

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

echo $_GET['nonExistingKey'];

由于密钥nonExistingKey不存在,因此无法检索,因此会导致错误。但是,PHP最初编译时无法决定这一点,只有当它与您提供的数据一起运行时才能确定。