我知道PHP在服务器上运行之前被编译为字节代码,然后可以缓存该字节代码,这样就不必为每个Web访问重新解释整个脚本 .
但是你可以“编译”php并上传一个二进制文件,它只能由字节码解释器运行吗?
在提出这个问题之后,Facebook推出了 HipHop for PHP ,这可能是迄今为止经过最佳测试的PHP编译器(因为它运行了世界上最大的10个网站之一) . 然而,Facebook停止使用HHVM,这是一个虚拟机,而不是编译器 .
除此之外,谷歌搜索 PHP compiler 出现了许多第三方解决方案 .
PHP compiler
Phalanger
GitHub(下载),Wikipedia
编译为.NET(CIL)
phc
编译为本机二进制文件
现在不太活跃(2014年2月) - 2011年的最后一个版本,2013年夏天的最后一次更改
Roadsend PHP Compiler
GitHub,GitHub of a rewrite
免费,带编译器的PHP开源实现
编译为本机二进制文件(Windows,Linux)
discontinued since 2010 till contributors found - 网站关闭,停留在GitHub,最后一次更改是从2012年初开始
bcompiler
PHP的PECL扩展
实验
编译为PHP字节码,但可以将其包装在加载PHP解释器的Windows二进制文件中(参见bcompiler_write_exe_footer() manual)
现已停止(2014年2月) - 2011年的最后一次更改
Project Zero
Wikipedia,IBM
WebSphere sMash变更孵化器
由IBM支持
编译为Java字节码
现在看来已停止(2014年2月) - 网站倒闭,看起来像2008年和2009年的大炒作
Bambalam
编译为独立的Windows二进制文件
二进制文件包含字节码和启动器
现已停止(2014年2月) - 2006年的最后一次更改
BinaryPHP
编译为C
现已停止(2014年2月) - 2003年的最后一次更改
最简洁的答案是不” .
PHP的当前实现是解释语言的实现 . 您可以论证任何语言在技术上可以被解释或编译的事实的理论方面,但就目前而言,当前的实现使得PHP代码需要运行解释器,并且解释器管理执行环境 .
要回答关于上传预编译的PHP字节码的问题,这可能是可能的,但您必须实现PHP解释器读取此类文件并使用它的方法 . 现有的操作码缓存已经存在,它似乎不是一项可以获得丰厚回报的任务 .
自从第一次提出这个问题以来,从“不”到“不是”这个问题的答案发生了变化 .
http://github.com/facebook/hiphop-php/wiki
Hip Hop for PHP是一个编译器,它使用PHP代码并将其转换为高度优化的C显然,某些功能不受支持(例如'explode')
我在寻找有关如何实施HipHop的更多信息的过程中发现了这个问题,并认为我会说出来:)
自2013年以来,Facebook不再使用它,并且已经停止使用HHVM,而HHVM不是编译器:https://en.wikipedia.org/wiki/HipHop_for_PHP
还有
目的
在专有PHP应用程序中编码整个脚本在专有PHP应用程序中编码某些类和/或函数要生成可以在客户端桌面上使用的php-gtk应用程序,而不需要php.exe . 进行PHP到C转换器的可行性研究
该扩展可从PECL获得 .
phc允许您将PHP程序编译为共享库,可以将其上载到服务器 . PHP程序被编译成二进制文件 . 它以支持 eval , include 和整个PHP标准库的方式完成 .
eval
include
如果您只是想从PHP脚本中生成二进制可执行文件,那么请避免尝试使您的问题非常精确,因为它会使您看起来确切地知道您需要什么 . 此外,大多数PHP开发人员对字节码的含义绝对不了解 .
话虽如此,答案是 YES . 我刚刚将PHP脚本编译成二进制文件 . 而不只是任何二进制文件 . 我已经使用CDE application(链接到Wayback Machine,original link现已被破坏)将其转换为可移植的二进制文件,可以与所有依赖项一起分发并执行而没有任何问题...并且它工作得很漂亮 .
所有你需要的是使用phc .
嗯,任何人都听说过Zend Guard,这正是这个人所要求的 . 它将PHP代码编码/混淆为"machine code" .
有几个PHP代码的“编译器” . 其中大多数不支持所有PHP功能,因为这些功能必须在运行时解释 .
我们正在使用Phalanger - http://www.php-compiler.net/ - 它甚至支持那些脏的PHP动态功能,并且仍然可以将它们编译为.NET程序集,可以作为独立的DLL进行分发 .
使用集成的OPcache模块看5.5.x,在共享内存中是volatile,更多的性能和php的动态原则保持不变 .
http://www.php.net/manual/en/opcache.installation.php
在PHP 7中有php ini选项opcache.file_cache,它将字节码保存在特定文件夹中 . In可能对于"compiled"的php cli脚本很有用,并保存在特定文件夹中以进行优化重用 .
Opcache它不是编译,但是类似的东西 .
PHP并没有像许多程序那样被编译 . 您可以使用Zend的编码器使其无法读取 .
11 回答
在提出这个问题之后,Facebook推出了 HipHop for PHP ,这可能是迄今为止经过最佳测试的PHP编译器(因为它运行了世界上最大的10个网站之一) . 然而,Facebook停止使用HHVM,这是一个虚拟机,而不是编译器 .
除此之外,谷歌搜索
PHP compiler
出现了许多第三方解决方案 .Phalanger
GitHub(下载),Wikipedia
编译为.NET(CIL)
phc
编译为本机二进制文件
现在不太活跃(2014年2月) - 2011年的最后一个版本,2013年夏天的最后一次更改
Roadsend PHP Compiler
GitHub,GitHub of a rewrite
免费,带编译器的PHP开源实现
编译为本机二进制文件(Windows,Linux)
discontinued since 2010 till contributors found - 网站关闭,停留在GitHub,最后一次更改是从2012年初开始
bcompiler
PHP的PECL扩展
实验
编译为PHP字节码,但可以将其包装在加载PHP解释器的Windows二进制文件中(参见bcompiler_write_exe_footer() manual)
现已停止(2014年2月) - 2011年的最后一次更改
Project Zero
Wikipedia,IBM
WebSphere sMash变更孵化器
由IBM支持
编译为Java字节码
现在看来已停止(2014年2月) - 网站倒闭,看起来像2008年和2009年的大炒作
Bambalam
编译为独立的Windows二进制文件
二进制文件包含字节码和启动器
现已停止(2014年2月) - 2006年的最后一次更改
BinaryPHP
编译为C
现已停止(2014年2月) - 2003年的最后一次更改
最简洁的答案是不” .
PHP的当前实现是解释语言的实现 . 您可以论证任何语言在技术上可以被解释或编译的事实的理论方面,但就目前而言,当前的实现使得PHP代码需要运行解释器,并且解释器管理执行环境 .
要回答关于上传预编译的PHP字节码的问题,这可能是可能的,但您必须实现PHP解释器读取此类文件并使用它的方法 . 现有的操作码缓存已经存在,它似乎不是一项可以获得丰厚回报的任务 .
自从第一次提出这个问题以来,从“不”到“不是”这个问题的答案发生了变化 .
http://github.com/facebook/hiphop-php/wiki
Hip Hop for PHP是一个编译器,它使用PHP代码并将其转换为高度优化的C显然,某些功能不受支持(例如'explode')
我在寻找有关如何实施HipHop的更多信息的过程中发现了这个问题,并认为我会说出来:)
自2013年以来,Facebook不再使用它,并且已经停止使用HHVM,而HHVM不是编译器:https://en.wikipedia.org/wiki/HipHop_for_PHP
还有
目的
该扩展可从PECL获得 .
phc允许您将PHP程序编译为共享库,可以将其上载到服务器 . PHP程序被编译成二进制文件 . 它以支持
eval
,include
和整个PHP标准库的方式完成 .如果您只是想从PHP脚本中生成二进制可执行文件,那么请避免尝试使您的问题非常精确,因为它会使您看起来确切地知道您需要什么 . 此外,大多数PHP开发人员对字节码的含义绝对不了解 .
话虽如此,答案是 YES . 我刚刚将PHP脚本编译成二进制文件 . 而不只是任何二进制文件 . 我已经使用CDE application(链接到Wayback Machine,original link现已被破坏)将其转换为可移植的二进制文件,可以与所有依赖项一起分发并执行而没有任何问题...并且它工作得很漂亮 .
所有你需要的是使用phc .
嗯,任何人都听说过Zend Guard,这正是这个人所要求的 . 它将PHP代码编码/混淆为"machine code" .
有几个PHP代码的“编译器” . 其中大多数不支持所有PHP功能,因为这些功能必须在运行时解释 .
我们正在使用Phalanger - http://www.php-compiler.net/ - 它甚至支持那些脏的PHP动态功能,并且仍然可以将它们编译为.NET程序集,可以作为独立的DLL进行分发 .
使用集成的OPcache模块看5.5.x,在共享内存中是volatile,更多的性能和php的动态原则保持不变 .
http://www.php.net/manual/en/opcache.installation.php
在PHP 7中有php ini选项opcache.file_cache,它将字节码保存在特定文件夹中 . In可能对于"compiled"的php cli脚本很有用,并保存在特定文件夹中以进行优化重用 .
Opcache它不是编译,但是类似的东西 .
PHP并没有像许多程序那样被编译 . 您可以使用Zend的编码器使其无法读取 .