您可以“编译” PHP代码并上传二进制文件,该文件将由字节码解释器运行吗?


224

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

但是,您可以“编译” PHP代码并上传一个二进制文件,该文件将由字节码解释器运行吗?


一个相关的问题:Windows的PHP编译器
Palec 2014年

3
请不要用hhvmhiphop标记它。HHVM不是问题的固有部分,只是可能的答案。meta.stackexchange.com/a/149347/238706
Palec 2014年

@HalayemAnis我认为您提到的链接错误。可以为该教程提供正确的链接吗?或任何最新更新的家伙?
CJ Ramki 2015年

@CJRamki对不起,请使用此链接COMPILE_PHP
Halayem Anis

这个问题实际上是相当模糊的。您可以“简单地”构建一个PHP编译器,您的源代码和一个PHP解释器(以其最大含义)编译为ELF,EXE或其他任何形式。
塞巴斯蒂安·马赫

Answers:


234

提出这个问题后,Facebook推出了适用于PHP的HipHop,它可能是迄今为止测试最完善的PHP编译器(它运行着世界十大网站之一)。但是,Facebook不再支持HHVM,后者是虚拟机,而不是编译器。

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

桃子派

  • PeachPie GitHub
  • 将PHP编译为.NET和.NET Core
  • 可以编译成独立的二进制文件
  • 在Mac,Linux,Windows,Windows Core,ARM等平台上运行

法郎格

  • GitHub(下载),Wikipedia
  • 编译为.NET(CIL)的日期从2017年7月开始停止,并且似乎不支持PHP 7。

电脑

  • 编译为本地二进制文件
  • 现在不太活跃(2014年2月)– 2011年最新版本,2013年夏季最新变化

Roadsend PHP编译器

编译器

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

零计划

  • 维基百科IBM
  • WebSphere sMash变更的孵化器
  • 受IBM支持
  • 编译为Java字节码
  • 现已停产(2014年2月)–网站关闭,在2008年和2009年看起来像是大肆宣传

班巴拉姆

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

二进制PHP

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

共享虚拟主机呢?我可以使用其中一种编译器编译PHP脚本,然后将其上传到基于Linux的Web主机吗?
SaidbakR

2
@sємsєм,这取决于您的主机,但是如果我不得不猜测,我想很多主机都不允许。
Frank Farmer

2
以上这些项目似乎都不再维护。最近两年以来,是否有一个公认的编译器?为什么所有这些项目都被忽略/放弃?
Preexo

一个PHP编译器的不错名单是在thefreecountry.com。现在,此答案中包含此处提到的所有工具。
Palec 2014年

1
由于所有这些似乎都已消失,答案似乎是“否”。
Ira Baxter

22

最简洁的答案是不”。

PHP的当前实现是一种解释语言。您可以争辩任何语言都可以在技术上进行解释或编译的事实的理论方面,但是就目前而言,当前的实现方式是PHP代码需要运行解释器,并且该解释器管理执行环境。

为了回答有关上载预编译的PHP字节码的问题,这可能是可行的,但是您必须实现一种方法,使PHP解释程序可以读取此类文件并使用它。现有的操作码缓存已经存在,这似乎并不会带来很多回报。


3
通常情况下,您确实需要解释器才能正确运行PHP程序,但这并不意味着编译器无法在已编译的代码中提供它。phc(phpcompiler.org)处理您描述的所有问题。据我所知,Roadsend(roadsend.com)也这样做。
Paul Biggar 2009年

28
这个答案已经过时了– HipHop在发布后的6个月后于2010
Frank Farmer

1
@FrankFarmer您有过HipHop的经验吗?HipHop是否可以include和和一起正常使用require?例如,如果通常包含PHP脚本,include( 'controller/' . $controller_name . '.php' )它将自动与HipHop一起使用吗?欢呼声
LEA海耶斯

2
实际上,您可以使用常规PHP编译器来编译PHP代码。它仅取决于目标平台。您可以编译为Zend操作码,C语言或.NET程序集(使用Phalanger php-compiler.net
JakubMíšek

1
The short answer is "no". The current implementation of PHP is that of an interpreted language. You can argue the theoretical aspects…没有任何理论上的解释,很多解释语言都有编译器。即AutoIt / AutoHotkey,甚至可以追溯到BASIC。其中编写了许多程序,然后将其编译为独立程序供公众使用。没有什么特别的要防止PHP不可编译的,这就是为什么存在大量编译器的原因,但是与AHK不同,没有官方的,经过测试的编译器-Zend Guard并不十分重要。
Synetech

16

自从首次提出问题以来,答案已经从完全否定变为“有点”

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

适用于PHP的Hip Hop是采用PHP代码并将其转换为高度优化的C ++的编译器,显然,不支持某些功能(例如'explode')

我在寻找有关如何实现HipHop的更多信息时发现了这个问题,并以为我会说出来:)

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


3
我相信这就是Facebook所使用的
理查德H 2010年

“种类”现在落后了几年,并且由于HHVM(HipHop Php)每天都在变得越来越好,因此有一种最终的方法(我认为)。使用HHVM,如今可以pre-analyze使用php代码。结果,您得到一个二进制缓存文件。使用此文件和正确的HHVM配置,可以仅使用字节码运行网页,而无需源文件了;)<br>我希望我做对了。
PKeidel 2014年

@ Andrea,HHVM被弃用是什么意思?它看起来像一个项目一样维护并活跃。还是您的意思是名称从PHP的Hip Hop更改为HHVM?然后谈论折旧是一种误导。
佩莱克

1
用于PHP的@Palec HipHop已停产。这是Facebook使用的从PHP到C ++的编译器,但产生笨拙的输出(多GB二进制文件),并且不支持全部语言。HHVM是共享一些相同代码的后续项目,但不是编译器。HHVM是虚拟机。Facebook不再支持HipHop。
安德里亚(Andrea)

11

也有

目的是

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

该扩展可从PECL获得。


8

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


8

如果您只是想从PHP脚本中生成二进制可执行文件,则请避免尝试使问题变得非常精确,因为这会使您似乎完全了解自己的需求。此外,大多数PHP开发人员对于字节码是什么几乎一无所知。

话虽如此,答案是肯定的。我刚刚完成将PHP脚本编译成二进制文件。不仅是二进制文件。我使用了CDE应用程序(链接到Wayback Machine,原始链接现在已断开)将其转换为可移植的二进制文件,可以分发所有依赖项,并且可以执行而没有任何问题……而且效果很好。

您只需要使用phc即可



2

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

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



1

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

Opcache它没有编译,但是类似。


“在php 7中”不仅仅是PHP7,它是PHP 5.5.0及更高版本
Raymond Nijland

0

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


它不是以与Perl相同的方式进行编译的吗?
卡森·迈尔斯,

我相信PHP是在服务器上即时编译的。我曾经使用编码器来隐藏源代码。如果那是您担心的。他们真的很好。

不,我只是对它的理论方面感兴趣
Carson Myers

2
不遵守PHP,它是一种解释语言。缓存包含php解释的“操作码”,而不必读取文本,php代码无法像使用c一样直接“运行”
borrel 2011年

0

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

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

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

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.