你能“编译”PHP代码吗?

时间:2009-09-11 00:23:29

标签: php bytecode

我知道PHP在服务器上运行之前被编译为字节代码,然后可以缓存该字节代码,这样就不必为每次Web访问重新解释整个脚本。

但你可以“编译”php并上传一个二进制文件,它只能由字节码解释器运行吗?

14 个答案:

答案 0 :(得分:228)

在提出这个问题之后,Facebook推出了 HipHop for PHP ,这可能是迄今为止经过最佳测试的PHP编译器(因为它运行的是世界上最大的10个网站之一)。然而,Facebook停止使用HHVM,这是一个虚拟机,而不是编译器。

除此之外,谷歌搜索PHP compiler出现了许多第三方解决方案。

Phalanger

phc

  • 编译为原生二进制文件
  • 现在不太活跃(2014年2月) - 2011年的最新版本,2013年夏季的最后一次更改

Roadsend PHP Compiler

bcompiler

  • PHP的PECL扩展
  • 实验
  • 编译为PHP字节码,但可以将其包装在加载PHP解释器的Windows二进制文件中(参见bcompiler_write_exe_footer() manual
  • 现已停止(2014年2月) - 2011年最后一次更改

Project Zero

  • WikipediaIBM
  • WebSphere sMash
  • 的更改孵化器
  • 由IBM支持
  • 编译为Java字节码
  • 现在看来已停止(2014年2月) - 网站倒闭,看起来像2008年和2009年的大肆宣传

Bambalam

  • 编译为独立的Windows二进制文件
  • 二进制文件包含字节码和启动器
  • 现已停止(2014年2月) - 2006年的最后一次更改

BinaryPHP

  • 编译为C ++
  • 现已停止(2014年2月) - 2003年的最后一次更改

答案 1 :(得分:22)

简短的回答是“不”。

PHP的当前实现是解释语言的实现。您可以论证任何语言在技术上可以被解释或编译的事实的理论方面,但就目前而言,当前的实现使得PHP代码需要运行解释器,并且解释器管理执行环境。

要回答关于上传预编译的PHP字节码的问题,这可能是可能的,但您必须实现PHP解释器读取此类文件并使用它的方法。现有的操作码缓存已经存在,它似乎不是一项可以获得丰厚回报的任务。

答案 2 :(得分:16)

自从第一次提出这个问题以来,答案从“不”到“某种”是一个变化

http://github.com/facebook/hiphop-php/wiki

Hip Hop for PHP是一个编译器,它使用PHP代码并将其转换为高度优化的C ++ 显然,某些功能不受支持(例如“爆炸”)

我在寻找有关如何实施HipHop的更多信息的过程中发现了这个问题,并且认为我会发言:)

自2013年以来,Facebook不再使用它,并且已停止使用HHVM,而HHVM不是编译器:https://en.wikipedia.org/wiki/HipHop_for_PHP

答案 3 :(得分:11)

还有

旨在

  
      
  • 在专有PHP应用程序中编码整个脚本
  •   
  • 在专有PHP应用程序中编码某些类和/或函数
  •   
  • 启用可在客户端桌面上使用的php-gtk应用程序的生成,而无需php.exe。
  •   
  • 进行PHP到C转换器的可行性研究
  •   

该扩展可从PECL获得。

答案 4 :(得分:8)

phc允许您将PHP程序编译为共享库,可以将其上载到服务器。 PHP程序被编译成二进制文件。它以支持evalinclude和整个PHP标准库的方式完成。

答案 5 :(得分:8)

如果您只是想从PHP脚本中生成二进制可执行文件,那么请避免尝试使您的问题非常精确,因为它会使您看起来确切地知道您需要什么。此外,大多数PHP开发人员对字节码的含义一无所知。

话虽如此,答案是。我刚刚将PHP脚本编译成二进制文件。而不只是任何二进制文件。我已经使用CDE application(链接到Wayback Machine,original link现已被破坏)将其转换为可移植的二进制文件,可以与所有依赖项一起分发并执行而没有任何问题...并且它工作得非常好

您只需使用phc

答案 6 :(得分:7)

嗯,有人听说过Zend Guard,这正是这个人所要求的。它将PHP代码编码/混淆为“机器代码”。

答案 7 :(得分:2)

有几个PHP代码的“编译器”。其中大多数都不支持所有PHP功能,因为这些功能必须在运行时解释。

我们正在使用Phalanger - http://www.php-compiler.net/ - 它甚至支持那些脏的PHP动态功能,并且仍然可以将它们编译为.NET程序集,可以作为独立的DLL进行分发。

答案 8 :(得分:1)

使用集成的OPcache模块查看5.5.x,在共享内存中使用volatile,更多的性能和php的动态原则保持不变。

http://www.php.net/manual/en/opcache.installation.php

答案 9 :(得分:1)

在php 7中有php ini选项opcache.file_cache,它将字节码保存在特定文件夹中。在PHP cli脚本中可能有用,它被“编译”并保存在特定文件夹中以便优化重用。

Opcache它不是在编译,而是类似的东西。

答案 10 :(得分:1)

如果允许您运行真正的本机二进制文件,则这是您的编译器:

https://github.com/ircmaxell/php-compiler

这是一个用PHP编写的PHP编译器

它将PHP代码编译为自己的VM代码。然后可以通过自己的解释器(也用PHP编写,不是很疯狂吗)来解释此VM代码,也可以将其翻译为Bitcode。并使用LLVM compiler frameworkclang和co),可以将此Bitcode编译为LLVM支持的任何平台(当今几乎所有重要平台)的本机二进制文件。您可以选择静态执行此操作,也可以选择每次执行代码之前(JIT样式)。因此,此编译器在您的系统上运行的唯一两个要求是安装的PHP解释器和安装的clang编译器。

如果不允许运行本机二进制文件,则可以将上面的编译器用作解释器,并让其解释自己的VM代码,但这会很慢,因为您正在运行本身在PHP上运行的PHP解释器。引擎,因此您具有“双重解释”。

答案 11 :(得分:0)

PHP并没有像许多程序一样被编译。您可以使用Zend的编码器使其无法读取。

答案 12 :(得分:0)

还有bcgen(bcompiler的PHP7端口):

https://github.com/vjardin/bcgen/

(仅限PHP7.2)

答案 13 :(得分:0)

实际上,PHP 8 中引入的实时编译器确实可以编译 PHP。奇怪的是,它并没有真正加速基于 CMS 的网站(例如 WordPress),然而,它确实为 PHP 与 C++ 之类的竞争打开了大门。有关更多信息,请参阅此处的 JIT 实现背后的 RFC:https://wiki.php.net/rfc/jit。此外,Matthew Weir O'Phinney 发布了许多有见地的博客,阐明了其功能。从这里开始阅读:https://www.zend.com/blog/exploring-new-php-jit-compiler