我知道 PHP 在服务器上运行之前会被编译为字节码,然后可以缓存该字节码,这样就不必在每次 Web 访问时重新解释整个脚本。
但是你能“编译”PHP 代码并上传一个二进制文件,它只会由字节码解释器运行吗?
在提出这个问题后,Facebook 推出了HipHop for PHP,它可能是迄今为止测试最好的 PHP 编译器(因为它运行着世界上 10 个最大的网站之一)。然而,Facebook 停止了它,转而支持 HHVM,它是一种虚拟机,而不是编译器。
除此之外,谷歌搜索PHP compiler
出现了许多第 3 方解决方案。
bcompiler_write_exe_footer()
手册)最简洁的答案是不”。
PHP 的当前实现是一种解释性语言。您可以争论任何语言在技术上都可以解释或编译这一事实的理论方面,但就目前而言,当前的实现是 PHP 代码需要解释器才能运行,而解释器管理执行环境。
要回答有关上传预编译 PHP 字节码的问题,这可能是可能的,但您必须实现一种方法让 PHP 解释器读取此类文件并使用它。有了现有的操作码缓存,这似乎不是一项可以获得太多回报的任务。
自从第一次提出这个问题以来,这个答案已经从一个完全的“不”变成了“有点”
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-gtk 应用程序的生产,而无需 php.exe。
- 进行 PHP 到 C 转换器的可行性研究
该扩展可从 PECL 获得。
phc允许您将 PHP 程序编译成共享库,可以上传到服务器。PHP 程序被编译成二进制文件。它以支持eval
s、include
s 和整个 PHP 标准库的方式完成。
嗯,任何人都听说过Zend Guard,这正是这个人所要求的。它将 PHP 代码编码/混淆为“机器代码”。
PHP 代码有几个“编译器”。它们中的大多数不支持所有 PHP 特性,因为这些特性必须在运行时进行解释。
我们正在使用 Phalanger - http://www.php-compiler.net/ - 它甚至支持那些肮脏的 PHP 动态特性,并且仍然能够将它们编译为 .NET 程序集,可以作为独立的 DLL 分发。
请参阅带有集成 OPcache 模块的 5.5.x,在共享内存中易失,更多的性能和 php 的动态原理保持不变。
如果您被允许运行真正的本机二进制文件,那么这就是您的编译器:
https://github.com/ircmaxell/php-compiler
这是一个用 PHP编写的 PHP 编译器!
它将 PHP 代码编译为自己的 VM 代码。然后,这个 VM 代码可以由它自己的解释器解释(也是用 PHP 编写的,这不是很疯狂吗?),或者它可以被翻译成 Bitcode。并且使用LLVM 编译器框架(clang
和 co),可以将此 Bitcode 编译为 LLVM 支持的任何平台(几乎是当今重要的任何平台)的本机二进制文件。您可以选择静态执行此操作,也可以选择每次在代码执行之前执行此操作(JIT 样式)。因此,该编译器在您的系统上工作的唯一两个要求是安装的 PHP 解释器和安装的clang
编译器。
如果您不允许运行本机二进制文件,您可以使用上面的编译器作为解释器并让它解释自己的 VM 代码,但这会很慢,因为您正在运行一个本身在 PHP 引擎上运行的 PHP 解释器,所以你有“双重解释”。
在 php 7 中有 php ini 选项opcache.file_cache将字节码保存在特定文件夹中。In 可能对“编译”并保存在特定文件夹中以优化重用的 php cli 脚本很有用。
Opcache 它没有编译,但类似。
PHP 并没有像许多程序那样真正被编译。不过,您可以使用 Zend 的编码器使其不可读。
实际上,PHP 8 中引入的 Just-In-Time 编译器确实可以编译 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 。