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

An_*_*oid 8 php

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

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

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

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

Mac*_*ity 20

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

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

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

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

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

  • 那么某些代码如何在编译时运行而其他代码在运行时运行呢?根据您的描述,似乎所有代码在运行时都抛出错误 (2认同)
  • 取决于错误。语法错误将在编译时被捕获。运行时错误(例如您的进程耗尽了分配的内存)将从运行时抛出。 (2认同)
  • 我认为这会有所帮助:http://bayanbox.ir/view/8066466214302126886/php-internals.jpg (2认同)

lon*_*day 13

PHP文件分两个阶段运行.

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

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

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

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

function class() {
    // some code
}
Run Code Online (Sandbox Code Playgroud)

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

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

echo $_GET['nonExistingKey'];
Run Code Online (Sandbox Code Playgroud)

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