PHP编译器BPC 6.0发布,支持namespace,支持closure,成功编译 workerman
release 地址: github.com/bob-php-compiler/bpc-re...
使用指南: github.com/bob-php-compiler/bpc-re...
不了解 BPC 是什么的可以翻看之前的帖子.
简言之,BPC 可以将 PHP 代码最终转译成 C 语言,然后编译成动态链接库或者可执行程序.
BPC 5.0 已经能够成功编译 Zend Framework 1 和我们公司自己的诸多项目.
但要想更广泛的应用,还缺两个大特性:
- namespace
- closure
1. 支持 namespace#
前些天看到 nikic/PHP-Parser 的 文档 , 发现 PHP 的 namespace 可以很容易地转化.
于是就照着文档写了一个 phptobpc.php, 借助这个小程序,可以将使用 namespace 的 PHP 代码转为没有 namespace 的.
当然 BPC 自身也做了相应的支持,这样动态调用也没问题。比如:
<?php
$classname = '\\Foo\\Bar\\Baz';
$o = new $classname;
我把这个程序打包成 phptobpc.phar, 下载回来 chmod +x
就能使用.
2. 支持 closure#
BPC 之前就已经支持简单的匿名函数,比如:
<?php
$a = array(1,2,3);
usort($a, function ($a, $b) { ... });
BPC 6.0 完善了 closure 实现,支持 use,typehint,default value 等特性,比如:
<?php
$a = 1;
$b = 2;
$f = function (array $arg1, &$arg2, $arg3 = 1) use ($a, &$b) { ... };
3. 成功编译 workerman#
之前有网友说能不能把 workerman 整个编译起来.
现在支持了 namespace 和 closure, 正好可以编译 workerman 试一试.
由于编译后执行和 PHP 解释执行还是有一些区别,要想成功编译和运行,需要对 workerman 的代码做一些微调.
整体来说,调整量很小。感兴趣的可以去查看 git commit .
由于 workerman 没有 unit tests, 我们自己也没有 workerman 的项目,所以不好做完整的验证.
但我照着 workerman 手册 , 写了以下几个例子:
- start.php
- ws_test.php
- tcp_test.php
- SimpleChat.php
- BinaryTransfer.php
- TextTransfer.php
运行起来,测试了一下,没有问题.
start
start -d
stop
restart
status
connections
这些命令都 OK.
但是由于编译后只有一个二进制文件,reload
显然是达不到预期效果的.
这几个例子我都静态编译出来了,想动手试一下的直接 下载 回来 gunzip
然后 chmod +x
执行即可 (注意只能在 ubuntu 18.04 上运行).
想自己动手编译的,参看 src/Makefile 和 examples/build.sh
4. 几个常见问题?#
BPC 是否开源?
BPC 是我们公司的内部项目,不打算开源.
商业化策略还未确定,在正式商业化前,我们每次 release 都会带一个约 7 天的试用 license, 如果过期了还想试用,只要给我们发个邮件我们就会再给 license.
如果想要就此项目进行深度合作,可以发邮件到 YnBjQG91cmF0cy5jb20=
BPC 和 VKCOM/kphp 以及 peachpiecompiler/peachpie 有什么区别?
BPC 的目标是源码保护和软件授权 (最终编译为 C), 在此基础上尽可能和 PHP 兼容,也就是说,一个 php 脚本最好什么都不改就能编译成二进制.
kphp 的目标是性能 (编译为 C++), 为此,它仅支持 limited subset of PHP, 参看 KPHP vs PHP differences
peachpie 的目标也是性能 (编译为 C#), 同时将.NET 引进来了.
BPC 和 Zend Guard, ionCube 以及 Swoole Compiler 有什么区别?
Zend Guard, ionCube 和 Swoole Compiler 都是在 PHP opcode 的基础上进行源码保护的.
BPC 应该来说和它们不是一类东西,只是目标相同罢了,BPC 和 kphp peachpie 算是一类.
PHP 官方是否会做编译器?
PHP 官方明确不做 Native AOT. 参看 Ahead of Time Compiler/AOT for PHP8?
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: