Post by account_disabled on Dec 14, 2023 4:06:40 GMT -5
PHP 8 于 2020 年 11 月 26 日正式发布。 这个重大的新更新为该语言带来了大量的优化和强大的功能,我们很高兴向您展示最有趣的变化,这些变化将使我们能够编写更好的代码并构建更强大的应用程序。 PHP 8 发布 PHP 8.0 公告附录 你准备好了?开始吧! PHP JIT(即时编译器) PHP 8 中最受欢迎的功能是即时 (JIT) 编译器。但什么是JIT? RFC 提案对 JIT 的描述如下: “PHP JIT 是作为 OPcache 的准独立部分实现的。可以在 PHP 编译时和运行时启用/禁用。启用后,PHP 文件的本机代码存储在 OPcache 共享内存的附加区域中,并且 维护指向 JIT 代码入口点的指针。 那么我们是如何实现 JIT 的?JIT 和 OPcache 之间有什么区别? 为了更好地理解 PHP 的 JIT 是什么,我们先快速了解一下 PHP从源代码到最终结果是如何执行的。 运行 PHP 包含 4 个步骤: 词法分析/标记化:首先,解释器读取 PHP 代码并构造一组标记。
解析:解释器检查脚本是否符合语法规则,并使用标记构建 电话号码清单 抽象语法树(AST),它是源代码结构的层次表示。 编译:解释器遍历树并将 AST 节点转换为低级 Zend 操作码,这些操作码是确定Zend VM 执行的指令类型的数字标识符。 解释:操作码在 Zend VM 上解释和执行。 下图直观地展示了 PHP 的基本执行过程。 PHP的基本执行流程 PHP的基本执行流程 那么 OPcache 如何使 PHP 更快呢?JIT的执行过程有何变化? OPcache 扩展 预加载 JIT——即时编译器 OPcache 扩展 PHP 是一种解释性语言。这意味着当执行 PHP 脚本时,解释器会针对每个请求一遍又一遍地解析、编译和执行代码。这可能会浪费CPU 资源 和额外时间。 这就是OPcache 扩展的用武之地: “OPcache 通过将预编译脚本的字节码存储在共享内存中来提高 PHP 的性能,从而消除 PHP 在每次请求时加载和解析脚本的需要。” 启用 OPcache 后,PHP 解释器仅在第一次执行脚本时才会执行上述 4 步过程。由于 PHP 字节码存储在共享内存中,因此它们可以立即用作低级中间表示,并且可以立即在 Zend VM 上执行。
启用 OPcache 的 PHP 执行过程 在启用 OPcache 的情况下运行 PHP 的过程 从 PHP 5.5 开始,Zend OPcache 扩展默认可用,您只需 从服务器上的脚本 调用它或检查 文件即可检查其配置是否正确(请参阅phpinfo()OPcache 配置设置)。 phpinfo 页面中的 Zend OPcache 部分 phpinfo 页面中的 Zend OPcache 部分 预加载 OPcache 最近通过预加载的实现进行了改进,预加载是 PHP 7.4中添加的 OPcache 的一项新功能。预加载提供了一种“在执行任何应用程序代码之前”在 OPcache 内存中存储一组特定脚本的方法,但它并没有为典型的基于 Web 的应用程序带来切实的性能改进。 您可以在PHP 7.4 简介中阅读有关预加载的更多信息。 借助 JIT,PHP 又向前迈进了一步。 JIT——即时编译器 尽管操作码采用低级中间表示形式,但它们仍然需要编译成机器代码。JIT“不引入任何附加形式的中间表示(IR – Intermediate Representation)”,而是使用 DynASM(代码生成引擎的动态汇编器)直接从 PHP 字节码生成本机代码。 简而言之,JIT将中间代码的热点部分翻译成机器代码。通过绕过编译,它可以显着提高性能和内存使用率。 PHP JIT 提案的合著者 Zeev Surasky 展示了 JIT 计算的速度会快多少: 但 JIT 真的能提高 WordPress 性能吗? 实时 Web 应用程序的 JIT 根据 JIT RFC,实现即时编译器应该可以提高 PHP 的性能。
解析:解释器检查脚本是否符合语法规则,并使用标记构建 电话号码清单 抽象语法树(AST),它是源代码结构的层次表示。 编译:解释器遍历树并将 AST 节点转换为低级 Zend 操作码,这些操作码是确定Zend VM 执行的指令类型的数字标识符。 解释:操作码在 Zend VM 上解释和执行。 下图直观地展示了 PHP 的基本执行过程。 PHP的基本执行流程 PHP的基本执行流程 那么 OPcache 如何使 PHP 更快呢?JIT的执行过程有何变化? OPcache 扩展 预加载 JIT——即时编译器 OPcache 扩展 PHP 是一种解释性语言。这意味着当执行 PHP 脚本时,解释器会针对每个请求一遍又一遍地解析、编译和执行代码。这可能会浪费CPU 资源 和额外时间。 这就是OPcache 扩展的用武之地: “OPcache 通过将预编译脚本的字节码存储在共享内存中来提高 PHP 的性能,从而消除 PHP 在每次请求时加载和解析脚本的需要。” 启用 OPcache 后,PHP 解释器仅在第一次执行脚本时才会执行上述 4 步过程。由于 PHP 字节码存储在共享内存中,因此它们可以立即用作低级中间表示,并且可以立即在 Zend VM 上执行。
启用 OPcache 的 PHP 执行过程 在启用 OPcache 的情况下运行 PHP 的过程 从 PHP 5.5 开始,Zend OPcache 扩展默认可用,您只需 从服务器上的脚本 调用它或检查 文件即可检查其配置是否正确(请参阅phpinfo()OPcache 配置设置)。 phpinfo 页面中的 Zend OPcache 部分 phpinfo 页面中的 Zend OPcache 部分 预加载 OPcache 最近通过预加载的实现进行了改进,预加载是 PHP 7.4中添加的 OPcache 的一项新功能。预加载提供了一种“在执行任何应用程序代码之前”在 OPcache 内存中存储一组特定脚本的方法,但它并没有为典型的基于 Web 的应用程序带来切实的性能改进。 您可以在PHP 7.4 简介中阅读有关预加载的更多信息。 借助 JIT,PHP 又向前迈进了一步。 JIT——即时编译器 尽管操作码采用低级中间表示形式,但它们仍然需要编译成机器代码。JIT“不引入任何附加形式的中间表示(IR – Intermediate Representation)”,而是使用 DynASM(代码生成引擎的动态汇编器)直接从 PHP 字节码生成本机代码。 简而言之,JIT将中间代码的热点部分翻译成机器代码。通过绕过编译,它可以显着提高性能和内存使用率。 PHP JIT 提案的合著者 Zeev Surasky 展示了 JIT 计算的速度会快多少: 但 JIT 真的能提高 WordPress 性能吗? 实时 Web 应用程序的 JIT 根据 JIT RFC,实现即时编译器应该可以提高 PHP 的性能。