我经常听到这两个词并继续思考
PHP中的编译时间与运行时间有什么区别?
我曾尝试阅读一些文章,但它没有帮助。
有人知道一个简单的解释吗?它们彼此有什么不同?
答案 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最初编译时无法决定这一点,只有当它与您提供的数据一起运行时才能确定。