你可以“编译”PHP代码?

我知道,在服务器上运行PHP之前,PHP已经被编译成字节码了,然后这个字节码就可以被caching起来,这样整个脚本就不用每次访问都要重新解释了。

但是,你可以“编译”PHP和上传二进制文件,这将只是由字节代码解释器运行?

在问到这个问题后,Facebook推出了HipHop for PHP ,这可能是迄今为止testing最好的PHP编译器(看起来它是世界上10个最大的网站之一)。 然而,Facebook停止了它,而是HHVM,这是一个虚拟机,而不是编译器。

除此之外,使用PHP compiler发现了许多第三方解决scheme。

Phalanger

  • CodePlex (下载), 维基百科
  • 编译为.NET(CIL)

PHC

  • 编译为本地二进制文件
  • 现在不太活跃(2014年2月) – 2011年最后一个版本,2013年夏天最后一次更新

Roadsend PHP编译器

  • GitHub , GitHub的一个重写
  • 免费的,开源的PHP编译器实现
  • 编译为本机二进制文件(Windows,Linux)
  • 自2010年以来停止,直到贡献者发现 – 网站closures,留在GitHub上,最后的变化是从2012年初

字节码编译

  • PHP的PECL扩展
  • 试验
  • 编译为PHP字节码,但可以将其封装在装载PHP解释器的Windows二进制文件中(请参阅bcompiler_write_exe_footer()手册 )
  • 现在看起来停止了(2014年2月) – 在2011年最后的变化

项目零

  • 维基百科 , IBM
  • WebSphere sMash更改的孵化器
  • 由IBM支持
  • 编译成Java字节码
  • 看起来停止了现在(2014年2月) – 网站下来,在2008年和2009年看起来像大炒作

Bambalam

  • 编译为独立的Windows二进制文件
  • 二进制文件包含字节码和启动程序
  • 现在看起来停止了(2014年2月) – 在2006年最后的变化

BinaryPHP

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

简短的回答是“不”。

PHP的当前实现是一种解释型语言。 你可以辩论任何语言在技术上可以被解释或编译的理论方面,但是就目前而言,当前的实现是PHP代码需要解释器运行,解释器pipe理执行环境。

要回答你关于上传预编译的PHP字节码的问题,这可能是可能的,但是你必须实现一种方式让PHP解释器读取这样的文件并使用它。 已经有了现有的操作码caching,看起来这不像是一个可以获得很大回报的任务。

由于这个问题首先被问到,从一个单一的“不”到“一种”

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

Hip Hop for PHP是一种编译器,它将PHP代码转化为高度优化的C ++。显然,某些函数不受支持(例如“explode”)。

我发现这个问题,同时寻找更多关于如何实现HipHop的信息,并认为我会说:)

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

也有

  • PHP的(实验性)编译器扩展 ,

其目标

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

该扩展可从PECL获得。

phc允许你将PHP程序编译成共享库,可以上传到服务器。 PHP程序被编译成二进制文件。 这样做是为了支持evalinclude s和整个PHP标准库。

如果您只是在寻找从PHP脚本生成二进制可执行文件,请避免让您的问题非常精确,因为它会使您看起来确切地知道您需要什么。 此外,大多数PHP开发人员对于字节码的含义绝对没有任何线索。

这样说,答案是肯定的 。 我刚刚完成编译一个PHP脚本成二进制。 而不只是任何二进制文件。 我已经使用CDE应用程序 (链接到Wayback Machine, 原来的链接现在被打破),把它变成一个可移植的二进制文件,可以与所有的依赖关系分发和执行没有任何问题…它的工作很好。

所有你需要的是使用phc 。

嗯,有人听说过Zend Guard ,这个人究竟在问什么。 它将PHP代码编码/混淆成“机器代码”。

有几个PHP代码的“编译器”。 他们中的大多数不支持所有的PHPfunction,因为这些function在运行时只需要解释。

我们正在使用Phalanger – http://www.php-compiler.net/ – 支持即使那些肮脏的PHPdynamicfunction,仍然能够将它们编译为.NET程序集,可以作为独立的DLL分发。

看到5.5.x集成了OPcache模块,在共享内存中挥发,更多的性能和php的dynamic原理保持不变。

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

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

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

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