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

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


当前回答

如果您只是想从PHP脚本生成二进制可执行文件,那么请避免试图使您的问题非常精确,因为这会让人觉得您确实知道自己需要什么。此外,大多数PHP开发人员完全不知道字节码是什么。

话虽如此,答案是肯定的。我刚刚将一个PHP脚本编译成二进制文件。而不是任何二进制。我已经使用CDE应用程序(链接到Wayback Machine,原来的链接现在被破坏了)把它变成一个可移植的二进制文件,可以与所有依赖项一起分发,并且执行起来没有任何问题……而且它工作得很漂亮。

你所需要的就是使用phc。

其他回答

简短的回答是“不”。

PHP的当前实现是一种解释性语言。您可以从理论上论证任何语言在技术上都可以被解释或编译的事实,但就目前的情况而言,当前的实现是PHP代码需要一个解释器才能运行,解释器管理执行环境。

要回答关于上传预编译的PHP字节码的问题,这可能是可行的,但必须实现一种方法,让PHP解释器读取这样的文件并使用它。由于已有的操作码缓存已经存在,这似乎不是一个会获得太多回报的任务。

见5.5。使用集成的OPcache模块,在共享内存中的易失性,更好的性能和php的动态原则保持不变。

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

在php 7中有php ini选项opcache。File_cache,用于将字节码保存到指定文件夹中。In可能对In php cli脚本有用,这些脚本被“编译”并保存在特定的文件夹中,以便优化重用。

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

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

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

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

除此之外,谷歌PHP编译器会出现许多第三方解决方案。

PeachPie

PeachPie GitHub 编译PHP到。net和。net核心 可以编译成自包含二进制文件 运行在Mac, Linux, Windows, Windows核心,ARM,…

袋貂

GitHub(下载),Wikipedia 编译到。net (CIL)从2017年7月开始停产,似乎不支持PHP 7。

phc

编译为本地二进制文件 现在不是很活跃(2014年2月)-上一个版本在2011年,最后一次更改在2013年夏天

Roadsend PHP编译器

GitHub的一个重写 免费的,开源的PHP编译器实现 编译为本地二进制文件(Windows, Linux) 自2010年停用,直到贡献者发现-网站关闭,留在GitHub上,上一次更改是在2012年初

b编译器

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

Project Zero

维基百科,IBM WebSphere sMash的变化孵化器 IBM支持 编译成Java字节码 现在看起来已经停止了(2014年2月)-网站关闭,看起来像2008年和2009年的大炒作

Bambalam

编译成独立的Windows二进制文件 二进制文件包含字节码和启动器 现在已经停产了(2014年2月)——2006年最后一次更换

二进制PHP

编译为c++ 现在看来已经停产了(2014年2月)——上一次更换是在2003年