为什么opcache缓存字节码而不是机器码?

时间:2019-07-17 08:12:27

标签: php opcache

PHP解释器首先将源代码转换为字节码。第二步,将字节码传递给Zend Engie,该Zend Engie创建相关CPU的机器码。如果opcache已激活,则字节码将存储在缓存中,以便可以在后续调用中跳过第一步。

Image from PHP Master Write Cutting Edge Code (图片取自PHP Master写尖端代码)

但是,我不明白为什么opcache缓存字节码而不是机器码?如果可以跳过第一步和第二步,这不会有太大的好处吗?另外,由于网站在很多情况下只能在一个服务器上执行,因此我看不出PHP在利用字节码的好处,即(如果我理解正确的话)字节码可以在不同的硬件上使用。


关于我的研究:我发现的大多数问题是关于PHP is interpreter or compiler language。 我发现的最接近的相关问题是:Can you "compile" PHP code and upload a binary-ish file, which will just be run by the byte code interpreter?-但是在这里,有人问是否可以事先解析字节码并上传(而不是缓存)。但是我的问题是,是否可以缓存机器代码而不是字节码。

1 个答案:

答案 0 :(得分:2)

假设是这样做的,因此只需要一种编译策略,并将其留给依赖于操作系统的PHP解释器,即可将OpCache转换为可以本地运行的机器代码。 将其与Java进行比较,在Java中,编译工件是JVM字节码,而具体取决于平台的JVM,以便将该字节码转换为可执行的机器代码。

如果PHP必须知道每个可能的平台(英特尔,amd,spark,arm等),这将使OpCache编译器大为膨胀。但是,您通常只在计算机上拥有所需的PHP运行时(在图中被称为Zend Engine)。