我知道PHP在服务器上运行之前被编译为字节代码,然后字节代码可以被缓存,这样整个脚本就不必在每次web访问时重新解释。
但是,您能否“编译”PHP代码并上传一个二进制文件,该文件将由字节码解释器运行?
PHP不像许多程序那样真正被编译。您可以使用Zend的编码器使其不可读。
简短的回答是“不”。
PHP的当前实现是一种解释性语言。您可以从理论上论证任何语言在技术上都可以被解释或编译的事实,但就目前的情况而言,当前的实现是PHP代码需要一个解释器才能运行,解释器管理执行环境。
要回答关于上传预编译的PHP字节码的问题,这可能是可行的,但必须实现一种方法,让PHP解释器读取这样的文件并使用它。由于已有的操作码缓存已经存在,这似乎不是一个会获得太多回报的任务。
在这个问题被问到之后,Facebook推出了HipHop for PHP,这可能是迄今为止测试最好的PHP编译器(因为它运行的是世界上最大的10个网站之一)。然而,Facebook为了支持HHVM而停止了它,HHVM是一个虚拟机,而不是编译器。
除此之外,谷歌PHP compiler会出现许多第三方解决方案。
PHP compiler
PeachPie
Phalanger
phc
Roadsend PHP Compiler . PHP编译器
bcompiler
bcompiler_write_exe_footer()
Project Zero
Bambalam
BinaryPHP
过去重要允许你将PHP程序编译成共享库,这些库可以上传到服务器。PHP程序被编译成二进制文件。它的实现方式是支持__abc0、__abc1和整个PHP标准库。
自从这个问题第一次被问到,答案已经从直截了当的“不”变成了“有点”
http://github.com/facebook/hiphop-php/wiki
我在寻找更多关于如何实现HipHop的信息时发现了这个问题,我想我应该说出来:)
然而,自2013年以来,Facebook不再使用它,它已经停止使用,转而支持HHVM,这不是一个编译器:https://en.wikipedia.org/wiki/HipHop_for_PHP
也有
它的目标是
在私有PHP应用程序中编码整个脚本 在私有PHP应用程序中编码一些类和/或函数 使php-gtk应用程序能够在客户端桌面上使用,而不需要php.exe。 做一个PHP到C转换器的可行性研究
扩展可从PECL。
嗯,有人听说过Zend警卫吗,它做的正是这个人想要的。它将PHP代码编码/混淆为“机器代码”。
PHP代码有几个“编译器”。它们中的大多数不支持所有PHP特性,因为这些特性必须在运行时进行解释。
我们正在使用Phalanger - http://www.php-compiler.net/ -它甚至支持那些肮脏的PHP动态特性,并且仍然能够将它们编译为。net程序集,可以作为一个独立的DLL分发。
如果您只是想从PHP脚本生成二进制可执行文件,那么请避免试图使您的问题非常精确,因为这会让人觉得您确实知道自己需要什么。此外,大多数PHP开发人员完全不知道字节码是什么。
话虽如此,答案是是的。我刚刚将一个PHP脚本编译成二进制文件。而不是任何二进制。我已经使用CDE应用程序(链接到Wayback Machine, 原始链接现在已经坏了)把它变成一个可移植的二进制文件,可以与所有依赖项一起分发,并毫无问题地执行……而且它工作得很漂亮。
你所需要的就是使用过去重要。
见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,它不是编译,而是类似的东西。
如果你被允许运行真正的本地二进制文件,那么这是你的编译器:
https://github.com/ircmaxell/php-compiler
它是PHP编译器用PHP写的!
它将PHP代码编译为自己的VM代码。然后,这个VM代码可以由它自己的解释器解释(也是用PHP编写的,是不是很疯狂?),也可以被翻译成Bitcode。并且使用LLVM编译器框架 (clang和co),这个位码可以被编译成LLVM支持的任何平台的本机二进制文件(几乎是当今重要的任何平台)。您可以选择静态地执行,也可以选择每次在代码执行之前执行(JIT风格)。所以这个编译器要在你的系统上工作,唯一的两个要求是安装PHP解释器和安装clang编译器。
clang
如果您不允许运行本机二进制文件,您可以使用上面的编译器作为解释器,让它解释自己的VM代码,但是这会很慢,因为您运行的PHP解释器本身运行在PHP引擎上,因此您有“双重解释”。
还有bcgen (bcompiler的一个PHP7端口):
https://github.com/vjardin/bcgen/
(仅PHP7.2)
实际上,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。